js的词法作用域、执行环境、作用域链

           1.执行环境:简称:“环境”,是JavaScript中最重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都有一个与之关联的“变量对象(variable object)”,全局执行环境的“变量对象”就是window对象,环境中定义的所有变量和函数都保存在这个对象中。我们编写的代码是无法访问这个对象的,但解析器在处理数据时会在后台使用它。

    2.全局执行环境是最外围的一个执行环境,在Web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法来创建的。某个执行环境中的所有代码执行完毕后,该环境就会被销毁,保存在其中的所有变量和函数定义也随之销毁。

    3.函数执行环境:每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。 

    4.作用域链:它的用途是保证对执行环境有权访问的所有变量和函数的有序访问,作用域链的前端,始终都是当前执行的代码所在的环境的变量对象。当代码在一个执行环境中执行时,会创建变量对象的一个作用域链(scope chain)。

           5.静态作用域(词法作用域)与动态作用域

                   因为采用词法作用域,函数的作用域在函数定义的时候就决定了。与词法作用域相对的是动态作用域,函数的作用域在函数调用的 时候才决定。

下面这个例子说明:     

var x=1;
function foo(){
console.log(x);

}
function bar(){
var x=2;
foo();
}
bar();

//结果为1,如果为动态作用域则为2

例子2: 

var str='gloalvar';
function getVal(){
var str='temvar';
function f(){
return str;
}
return f();
}
getVal();
//结果为temvar

对比:

var str='gloalvar';
function getVal(){
   var str='temvar'; 
   function f(){ 
     return str;
   } 
   return f;
}
getVal()();

//结果为temvar 

    这再一次证明,函数的作用域在定义的时候就决定了。JavaScript函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数f()定义在这个作用域链里,其中的变量scope一定是局部变量,不管何时何地执行函数f(),这种绑定在执行f()时依然有效。



















 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
 

你可能感兴趣的:(javascript)