1、无块级作用域

javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦。在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域

举个例子

if(true) {
var name = "saber"
};
console.log(name)//saber

上面的代码可以看到,if判断语句中定义的变量所在的环境是全局环境,因此在if判断外面也能访问到该变量

(1)声明变量

function add(num1,num2){
// var sum = num1+num2;//注意:如果下面sum = num1+num2;换成本行的话,会报错sum is not defined,因为使用了var定义sum,导致该变量会被添加到最近的局部环境中,也就是add函数中,因此外部访问不到,就会报错未定义
sum = num1+num2;//这里没有使用var,当函数执行完后,sum被添加到全局环境中,因此函数外部能访问到
return sum;
}
var result = add(7,7);
console.log(sum)//
console.log(result)//

(2)查询标识符

就不说废话了,直接上代码解释:

var name = "saber";
function getName(){
return name;
}
console.log(getName())//saber

在调用函数getName的时候会引入定义的变量name。为了确定name的值,将开始两步搜索过程。首先搜索getName()的对象,看看是否包含一个叫name的标识符。好的,没有呢,那就继续找下一个变量对象,啊哈到了全局环境的变量对象了哈,哦豁找到了定义的name变量,结束。

简单来说就是从局部环境开始:开始→局部环境→上一级环境→上一级...→全局环境→结束。

哪有人说,假如我在函数内部就定义了,结果会怎样,你看!

var name = "saber";
function getName(){
var name = "archer";
return name;
}
console.log(getName())//archer

原因很简单,从局部环境开始查询,查到后,就没后面什么事了,搜索停止。

2、垃圾回收机制

js能自动管理内存的回收,具体原理很简答:

找出那些不再使用的变量,然后释放其占用的内存。

3、管理内存

在代码执行中值保存必要的数据,一旦数据不再有用,最好将其设为null来是释放引用——解除引用

function getName(){
var name = "saber";
return name;
}
var person = getName()
console.log(person)//saber
person = null//解除引用

解除引用不意味着自动回收这个值所占的内存,真正地作用是让值脱离执行环境,方便垃圾收集器下次运行时将其回收

浅谈javascript中变量作用域和内存(2)的更多相关文章

  1. 浅谈javascript中变量作用域和内存(1)

    先理解两个概念:基本类型和引用类型的值 1.基本类型和引用类型的值 (1)定义: 基本类型:指简单的数据段,比如按值访问的js五种基本数据类型undefined.null.boolean.number ...

  2. 浅谈javascript中的作用域

    首先说明一下:Js中的作用域不同于其他语言的作用域,要特别注意     JS中作用域的概念: 表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境.Javascript的作 ...

  3. 浅谈javascript的变量作用域

    1.变量遵循先声明再使用. console.log(b); b=123; 代码运行结果: Uncaught ReferenceError: b is not defined 2.方法内定义的局部变量外 ...

  4. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  5. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

  6. 浅谈JavaScript中的正则表达式(适用初学者观看)

    浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...

  7. 浅谈JavaScript中的变量、参数、作用域和作用域链

    基本类型和引用类型 在JavaScript中有两种数据类型值.基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指的是可能由多个值构成的对象.在JavaScript中有5种基本数据类型 ...

  8. 浅谈JavaScript中的内存管理

    一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...

  9. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

随机推荐

  1. 从0开始学爬虫8使用requests/pymysql和beautifulsoup4爬取维基百科词条链接并存入数据库

    从0开始学爬虫8使用requests和beautifulsoup4爬取维基百科词条链接并存入数据库 Python使用requests和beautifulsoup4爬取维基百科词条链接并存入数据库 参考 ...

  2. 从0开始学爬虫3之xpath的介绍和使用

    从0开始学爬虫3之xpath的介绍和使用 Xpath:一种HTML和XML的查询语言,它能在XML和HTML的树状结构中寻找节点 安装xpath: pip install lxml HTML 超文本标 ...

  3. 【转载】 我的Machine Learning学习之路

    原文地址: https://www.cnblogs.com/steven-yang/p/5857964.html ------------------------------------------- ...

  4. LDFLAGS 与 LDLIBS

    今天下载了开源程序“贪吃蛇” (github地址 : https://github.com/taylorconor/tinytetris.git) 在编译时,出现如下错 linux:~/code/ot ...

  5. [Sklearn] Linear regression models to fit noisy data

    Ref: [Link] sklearn各种回归和预测[各线性模型对噪声的反应] Ref: Linear Regression 实战[循序渐进思考过程] Ref: simple linear regre ...

  6. MySql存储过程常用的函数

    字符串类 CHARSET(str) //返回字串字符集CONCAT (string2 [,... ]) //连接字串INSTR (string ,substring ) //返回substring首次 ...

  7. 【434】COMP9024 Exercises Revision

    目录: Week01 Week02 Week03 Week04 Week05 Week06 Week07 Week08 Week09 Week10 01. Week01 数字通过 #define 来定 ...

  8. WebGL高级编程:开发Web3D图形 PDF(中文版带书签)

    WebGL高级编程:开发Web3D图形 目录 WebGL简介11.1 WebGL基础11.2 浏览器3D图形吸引人的原因21.3 设计一个图形API31.3.1 即时模式API31.3.2 保留模式A ...

  9. spring 多个切面如何有序执行

    Spring也能支持多个切面.当有多个切面时,它不会存在任何顺序,这些顺序代码会随机生成,但是有时候我们希望它按照指定的顺序运行. 在此之前要先定义一个切点方法,为此新建一个接口——MultiBean ...

  10. 进程间通信之pipe

    实现数据传递 两个进程之间通信 多个进程之间通信,会导致数据不安全,需要加锁,示例 分类 无名管道:父子间进程通信 有名管道:父子间进程通信:任意两个进程之间通信 创建管道方法 os.mkfifo(p ...