JavaScript中变量的范围是什么?

javascript中变量的范围是什么? 他们有相同的范围内,而不是功能外? 或者它甚至很重要? 另外,如果变量是全局定义的,则变量存储在哪里?


我想我能做的最好的就是给你一些学习的例子。 Javascript程序员的实际排名依据他们对于范围的理解程度。 它有时可能是非常直观的。

  • 一个全局范围的变量

    // global scope
    var a = 1;
    
    function one() {
      alert(a); // alerts '1'
    }
    
  • 本地范围

    // global scope
    var a = 1;
    
    function two(a) {
      // local scope
      alert(a); // alerts the given argument, not the global value of '1'
    }
    
    // local scope again
    function three() {
      var a = 3;
      alert(a); // alerts '3'
    }
    
  • 中级 :没有像JavaScript中的块范围(ES5; ES6介绍let

    一个。

    var a = 1;
    
    function four() {
      if (true) {
        var a = 4;
      }
    
      alert(a); // alerts '4', not the global value of '1'
    }
    

    var a = 1;
    
    function one() {
      if (true) {
        let a = 4;
      }
    
      alert(a); // alerts '1' because the 'let' keyword uses block scoping
    }
    
  • 中级 :对象属性

    var a = 1;
    
    function Five() {
      this.a = 5;
    }
    
    alert(new Five().a); // alerts '5'
    
  • 高级 :关闭

    var a = 1;
    
    var six = (function() {
      var a = 6;
    
      return function() {
        // JavaScript "closure" means I have access to 'a' in here,
        // because it is defined in the function in which I was defined.
        alert(a); // alerts '6'
      };
    })();
    
  • 高级 :基于原型的范围解析

    var a = 1;
    
    function seven() {
      this.a = 7;
    }
    
    // [object].prototype.property loses to
    // [object].property in the lookup chain. For example...
    
    // Won't get reached, because 'a' is set in the constructor above.
    seven.prototype.a = -1;
    
    // Will get reached, even though 'b' is NOT set in the constructor.
    seven.prototype.b = 8;
    
    alert(new seven().a); // alerts '7'
    alert(new seven().b); // alerts '8'
    

  • 全球+本地 :一个额外的复杂案例

    var x = 5;
    
    (function () {
        console.log(x);
        var x = 10;
        console.log(x); 
    })();
    

    这将打印出undefined10而不是510因为JavaScript总是将变量声明(不是初始化)移动到范围的顶部,使得代码等同于:

    var x = 5;
    
    (function () {
        var x;
        console.log(x);
        x = 10;
        console.log(x); 
    })();
    
  • 捕获子句范围的变量

    var e = 5;
    console.log(e);
    try {
        throw 6;
    } catch (e) {
        console.log(e);
    }
    console.log(e);
    

    这将打印出565 。 在catch子句中, e阴影全局变量和局部变量。 但是这个特殊范围仅适用于被捕获的变量。 如果你写var f; 在catch子句中,那么它就像在try-catch块之前或之后定义它一样。


  • Javascript使用范围链为给定函数建立范围。 通常有一个全局范围,每个定义的函数都有自己的嵌套范围。 在另一个函数中定义的任何函数都有一个与外部函数链接的局部范围。 始终是定义范围的来源中的位置。

    作用域链中的一个元素基本上是一个带有指向其父作用域的指针的Map。

    解析变量时,JavaScript从最内层的范围开始并向外搜索。


    全局声明的变量具有全局范围。 在一个函数中声明的变量的范围是该函数的范围,并且映射同名的全局变量。

    (我敢肯定有很多的奥妙,真正的JavaScript编程人员能够在其他的答案指出,特别是我碰到这个网页来了解究竟this意味着在任何时候,希望这个更详细介绍的链接,就足以让你开始虽然。)

    链接地址: http://www.djcxy.com/p/1065.html

    上一篇: What is the scope of variables in JavaScript?

    下一篇: Deep cloning objects