关于JS变量和作用域详解
ECMAScript 变量:
1.基本类型值(简单数据段)
2.引用类型值(可能由过个值构成的对象) → 保存在内存中的对象
------
动态属性: 只能给引用型值动态添加新属性,以便将来使用。
------
复制变量值 :
基本类型值的复制 → 在变量对象上创建一个新值 → 复制给新变量(互不影响)
引用类型值的复制 → 将存储在变量对象中的值复制到新变量分配空间中(复制的是一个指针,指向同一个对象,相互影响)
------
传递参数:
ECMAScript中所有函数的参数都是按值传递 。
(函数外部的值复制给函数内部的参数。
→ 可以把ECMA函数的参数想象成局部变量。)
原因解释:
说法一:
函数参数是一种局部变量,在外部值传递给函数参数,内部外部互不影,引用传递复制的是地址,所以他内务外部相互有影响。
说法二:对象角度(参数是一个对象 obj)
------
对象按值传递 → 参数对象和外部对象引用同一个对象 → 外部对象指向的对象在堆内存中只有一个,且是全局变量。
不要错认为是在局部作用在修改的对象在全局作用域(外部)反映出来的结果 → 函数内部的局部变量在函数执行完会立即销毁。
------
执行环境(有时候也简称“环境”)及作用域
执行环境定义了白?莼蚝?数有权访问其他数据决定了他们各自的行为 → 每个执行环境都有一个与之关联的变量对象 → 环境中定义的所有变量和函数都保存在这个对象。
------
每个函数都有自己的执行环境 → 当执行流进入一个函数时 → 函数环境会被推入一个环境栈中 → 在函数执行后将其弹出 → 把控制权返回给之前的执行环境
代码在一个环境执行中时,会创建变量对象的一个作用域链(scope chain)
作用域链用途:保证对执行环境有权访问的所有变量和函数的有序访问。
作用域链的前端,始终都是当前执行的代码所在环境的变量对象
------
内部环境可以通过作用域链所有的外部环境,但是外部环境不能访问内部环境(环境的联系是线性的,有次序的 → 向上搜索作用域链以查询变量和函数名)
函数参数也被当做变量来对待
------
延长作用域链:
有些语句可以在作用域的前端链临时增加一个变量(变量在代码执行后移除)
1.try-catch语句的catch块
2.with语句
------
Javas没有块级作用域
这里可以再简单区分一下块级作用域和函数作用域