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。
  • 动态作用域,作用域是基于调用栈的,而不是代码中的作用域嵌套

补充

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 - js 作用域 静态作用域 作用域是指程序源代码中定义变量的区域。 作用域规定了如何查找变量,也就是确定当...
    signiliance阅读 871评论 0 1
  • 简介 JavaScript 有个特性称为作用域。尽管对于很多开发新手来说,作用域的概念不容易理解,我会尽可能地从最...
    MapleLeafFall阅读 1,943评论 0 0
  • 本文摘抄自冴羽的博客 JavaScript深入系列15篇正式完结](https://github.com/mqyq...
    bacbcc94613b阅读 3,418评论 0 1
  • BY 张建成(prettyEcho@github)除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2....
    echo_me阅读 3,012评论 1 0
  • 引子 在进入本文的主题前,首先请大家判断如下代码输出结果为什么?并说明理由。 不管大家的答案是什么,这里正确得答案...
    markouy阅读 3,392评论 0 2