转载

OOP之作用域与闭包

  • 定义

在编程语言中,作用域控制着变量与参数的可见性及生命周期,它能减少名称冲突,而且提供了自动内存管理 –javascript 语言精粹

  • 一个变量、函数或者成员可以在代码中访问到的范围
    • js 的变量作用域是基于其特有的作用域链的。
    • 全局变量都是 window 对象的属性
    • 没有块级作用域
    • 函数中声明的变量在整个函数中都有定义
      //全局作用域
      var a = 10;
      
      //没有块级作用域
      if(fasle){
          var b =2;
      }
      
      //函数作用域
      functionf(){
          var a = 1;
          console.log(a);
      }
      

作用域链

  • 作用域链是一个对象列表,上下文代码中出现的标识符在这个列表中进行查找
  • 如果一个变量在函数自身的作用域(在自身的变量/活动对象)中没有找到,那么将会查找它父函数(外层函数)的变量对象,以此类推
functionf(){
    var x =100;
    functiong(){
        console.log(x);
    }
    g();
}
f();
  • 这里形成了一条作用域链,当函数 g 访问不到变量时,它会通过内部的 [[scope]] 对象查找作用域链上的执行上下文,当找到就终止,找不到会继续,直到 window 对象上也没有的时候,会报错
  • 需要注意的是,用 new Function 创建的函数,其作用域指向全局作用域
functionf(){
    var x = 100;
    // g.[[scope]] == window
    var g = new Function("", "alert(x)");

    g();
}
f();
//报错 x is not defined
原文  http://blog.poetries.top/2016/12/13/js-scope/
正文到此结束
Loading...