作用域

2020-03-31  本文已影响0人  LenHong

静态作用域 (词法作用域) 和 动态作用域

下面的例子可以帮助理解

var value = 1;
function foo() {
    console.log(value);
}
function bar() {
    var value = 2;
    foo();
}
bar();
  1. 假设 JavaScript 采用 静态作用域,函数执行如下
    执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
  2. 假设 JavaScript 采用 动态作用域,函数执行如下
    执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
  3. 因为 JavaScrip 使用的是静态作用域,所以结果会打印 1

下面两个例子可以更好的理解 JavaScrip 的作用域

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

结果是两段代码都会打印:local scope

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

简单的说,因为JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置。

参考:https://github.com/mqyqingfeng/Blog/issues/3

上一篇下一篇

猜你喜欢

热点阅读