JS变量类型和作用域

JavaScript细节

作者 Trekerz 日期 2017-08-06
JS变量类型和作用域

一、基本类型和引用类型的值

基本类型值:栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。

Undefined、Null、Boolean、Number、String。

占有固定大小,保存在栈内存中可以提高查询速度。(按值访问)

引用类型值:堆内存中的对象,意思是变量中保存的实际上只是一个指针,指向内存中的额另一个位置,该位置保存对象。

指针(即内存地址)保存在栈内存中,对象保存在堆内存中。(按引用访问)

二、传递参数

ECMAScript中所有函数的参数都是 按值传递 的:

  1. 对于基本类型值:被传递的值会被复制给一个局部变量(即命名参数,也就是arguments对象中的一个元素);
  2. 对于引用类型值:这个值的地址会被复制给一个局部变量(即命名参数),即命名参数和传入的参数指向的是堆内存中的同一个对象,修改会连带。

三、检测类型

  1. 检测基本类型值:typeof(会返回string、number、boolean、undefined、object)。例:var s=”zjf”; alert(typeof s); //string
  1. 检测引用类型值:instanceof(会返回true或false);

例:alert(colors instanceof Array); //true

注:instanceof在检测基本类型时都返回false,因为基本类型不是对象。

四、执行环境及作用域

  1. 执行环境:定义了变量或函数有权访问的其他数据,决定了它们各自的行为。
  2. 变量对象:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
  3. 全局执行环境:是最外围的一个执行环境。在 Web浏览器中,全局执行环境被认为是window对象,所有全局变量和函数都是作为window对象的属性和方法。
  4. 每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,执行完后又弹出栈。
  5. 作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问
  6. 标识符的解析:是沿着作用域链一级一级地搜索标识符的过程。
  7. 作用域链中的作用域对内透明,对外不透明(也就是外层的看不到里层的)。
  8. 函数参数也被当做变量,所以访问规则与执行环境中其它变量相同
  9. 延长作用域链

有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在执行后被移除。

try-catch语句的catch块:会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。(IE8及之前版本有catch外也能访问到错误对象的bug)

with语句:会将指定的对象添加到作用域链中。


end -