js从0开始学习

js - 12 JS作用域和作用域链

2019-11-06  本文已影响0人  大怪兽迪迦

作用域

function test(o){              
 var i = 0;                      // i在整个函数体内均是有定义的
 if(typeOf o == "object"){       
   var j = 0;                    // j在函数体内是有定义的,不仅仅在这个代码段
   for(var k = 0; k < 10; k ++){  // k在函数体内是有定义的,不仅仅在这个循环内 
     console.log(k)              // => 1~9     
    };
    consloe.log(k)               // => k已经定义,输出10
  };
  console.log(j)                 // => j已定义,但没有初始化
}
var scope = "global";
function f(){
   console.log(scope);            // 输出undefined,而不是“global”
   var scope = "local";          // 变量在这里赋值,在函数体内的任何位置都有定义
   console.log(scope);           // 输出“local”
}

以上,虽然在函数f()外,scope被定义,但执行到函数内第一行时就被重新定义,但未被赋值,所以输出undefined,运行到第二行时才被赋值。为了方便理解上述函数f()可以写成

function f(){
   var scope;
   console.log(scope);            
   var scope = "local";          
   console.log(scope);
}

作用域链(纯理论,理解!理解!理解!)

概念

每一段js代码都有一个与之关联的作用域链,这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量,当js需要找一个变量x时,会从链中的第一个对象开始,没有就找下一个,如果在一个对象中找到名为x的属性,就会停止,如果在链中没有找到说明该链中并不存在x,并最终抛出一个引用错误(ReferenceError)异常.

理解

上一篇下一篇

猜你喜欢

热点阅读