Javascript 高级编程 4章73页 【执行环境及作用域】

117 阅读2分钟

执行环境及作用域

  • 执行环境 (execution context, 简称,环境)
  • 定义了变量或函数有权访问的其他数据,决定了它们各自的行为
  • 执行环境中的所有代码执行完毕后
    • 环境被销毁
    • 保存其中的变量和函数也随之被销毁
  • 当代码在一个执行环境中运行时,会创建variable object的作用域链 (scope chain)
    • 用于有序回溯标识符

执行环境所关联的 variable object

每一个执行环境都有一个与之关联的变量对象 (variable object)

  • 环境中定义的所有变量和函数,都保存在这个variable object中
  • 我们编写的代码,无法访问这个variable object
  • 解析器会在后台使用这个variable object

全局执行环境

全局执行环境是最外围的一个执行环境

  • 根据ECMAScript的实现所在的宿主环境不同,用来表示执行环境的 variable object 也不同
    • Web 浏览器中,是window对象
  • 直到应用程序退出时,才会被销毁。例如,关闭浏览器
  • 其variable object始终是作用域链的最后一个

函数的执行环境

每一个函数都有自己的执行环境

  • 其活动对象 (activation object)为其variable object
  • variable object里包括了:
    • arguments对象
    • 包含函数的环境的variable object(依次从内到外,有序包含)

延长作用域链

虽然说,执行环境只有两种————全局和局部(函数)。但有其他办法来延长作用域链 以下两种语句中的变量,的作用域链会得到加长:

  • with()语句。将括号内的对象添加到作用域链的前端。
  • try-catch语句中的catch块。将新创建的,包含被抛出的错误对象的声明的对象,添加到作用域链的前端
function buildUrl() {
    var qa = "?debug=true";
    
    with(location) {
        var url = href + qs;
    }
    
    return url;
}

  • 其中,url的作用域链被延长,使得url在buildUrl的执行环境中了。所以可以作为函数的值被返回

没有块级作用域

Javascript没有块级作用域

if (true) {
    var color = "blue";
}
alert(color);  //blue
for (var i=0; i < 10; i++)
{
    doSomething(i);
}
alert(i); //10

声明变量的方式 和 作用域 的关系

使用var声明的变量,会被自动添加到最接近的环境中

  • 在函数内部,则为函数,这个局部环境
  • with语句中,则为其所在的函数,这个局部环境

没有用var声明的变量,直接初始化,那么这个变量会被自动添加到全局环境中

function add(num1, num2) {
    sum = num1 + num2;
    return sum;
}
var result = add(10, 20); //30
alert(sum);   //30

不建议,不声明直接初始化

寻找标识符

按作用域链来寻找

var color = "blue";
function getColor () {
    return color;
}
alert(getColor());  //"blue"
var color = "blue";
function getColor () {
    var color = "red";   
    return color;
}
alert(getColor());  //"red"