Javascript作用域

是什么

作用域是指程序源代码中定义变量的区域。
作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

怎么用

全局作用域

生命周期将存在于整个程序之内。
能被程序中任何函数或者方法访问。
在 JavaScript 内默认是可以被修改的。

容易被污染,能不用就别用。

函数作用域

函数内部作用域,其中变量,可以通过 return 获取。

  var foo = function(n) {
    var innerVariable = "ahhh"
    return "hello" + String(n);
  }
  console.log(foo(" world"));  // "helloworld"
  console.log(innerVariable);  //Uncaught ReferenceError: innerVariable is not defined

块级作用域

同类C语言,{}形成块作用域。如下

    {
        let var_a = 1;
        var var_b = 2;
    }
    console.log(var_a);  //Uncaught ReferenceError: var_a is not defined
    console.log(var_b);  //2

ECMAScript通过let const变量的声明方式,实现了块作用域。

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

JavaScript采用静态作用域。
先看如下代码

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

考虑bar()执行的打印结果。
如果JS是静态作用域,执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
如果JS是动态作用域,执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
做过实验克制,JS是采用静态作用域,即打印1。

结论:JavaScript是采用词法(静态)作用域。

动态作用域(Ref. this binding)

  • 在 JavaScript 中的仅存的应用动态作用域的地方:this 引用。慎用this,待后续章节研究Javascript的this。
  • 动态作用域,作用域是基于调用栈的,而不是代码中的作用域嵌套

补充

  • 待补充模块:
    • JavaScript->this(动态作用域), self
  • Refs:
    • https://github.com/mqyqingfeng/Blog/issues/3

你可能感兴趣的:(Javascript作用域)