深入--词法作用域和动态作用域

javascript标题深入开头文章转自:https://github.com/mqyqingfeng/Blog 文章某些部分可能因为理解不同做一些修改

作用域指对某一变量或方法具有访问权限的代码空间,javascript采用词法作用域,也就是静态作用域。js没有块级作用域。

静态作用域,变量和方法的作用域在定义时就确定了

动态作用域,变量和方法的作用域在运行时才确定

举个例子:

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

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

bar();

//结果为1

 执行foo函数,函数内部没有局部变量value,就在foo函数定义的上一级查找value=1;

如果是动态作用域,foo函数内部查找不到value变量,就从调用函数的作用域,也就是是bar函数内部查找value变量,所以结果会是2

比如说bash就是动态作用域,把下面脚本存成例如scope.bash,然后执行bash ./scope.bash看看打印值

value=1
function foo () {
    echo $value;
}
function bar () {
    local value=2;
    foo;
}
bar

下面是《javascript权威指南》中的例子:

var scope = "global scope";
function checkscope(){
   var scope = "local scope";
   function f(){
         return scope;
   }
   return f();
}
checkscope();
var scope = "globle scope";
function checkscope(){
       var scope = "local scope";
       function f(){
            return scope;
       }
       return f;
}
checkscope()();

两段代码的结果都是:localscope

原因很简单,javascript采用的是词法作用域,函数的作用域基于函数创建的位置

而引用《javascript权威指南》的回答就是:

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

但是这里想让大家思考的是:

虽然两段代码执行的结果一样,但是两段代码究竟有哪些不同?

回答这个问题,要牵涉很多内容,词法作用域只是其中一小部分,请看下篇《深入--执行上下文栈》

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2377544