【问题标题】:Understanding Scope了解范围
【发布时间】:2016-04-23 18:47:30
【问题描述】:

我以为我理解范围,但是在考虑我遇到的特定代码问题时,我对以下内容感到困惑:

var a = {
  aFunc: function() {
    console.log(x);
  }
};
var b = {
  bFunc: function() {
    var x = c.x;
    console.log(x);
    a.aFunc();
  }
};
var c = {
  x: 'x is in c'
};

b.bFunc();

问题:aFuncbFunc 内部被调用,为什么我在aFunc 内部得到'x is not defined'?这不是a.aFunc 可以访问b.bFunc 作用域的简单闭包吗?

【问题讨论】:

    标签: javascript scope closures lexical-scope


    【解决方案1】:

    这不是一个简单的闭包,a.aFunc 可以访问 b.bFunc 范围吗?

    没有。闭包是函数的一个属性,它包含在其范围内的所有变量,在定义期间,而不是在调用期间。

    在您的情况下,当a.aFunc 被调用时,它不会将变量包含在b.bFunc 中,因为它只是在那里被调用,而不是在那里定义。


    让我们试着用这个例子来理解这一点

    function Test1(func) {
      var a = 0;
      func();
    }
    
    function Test() {
      var a = 5;
      Test1(function() {
        console.log(a);
      });
    }
    
    Test();
    

    将打印5,因为在执行func() 时,实际的函数对象已经包围了Test 中的变量,因为闭包发生在函数定义期间。

    【讨论】:

      【解决方案2】:

      不,每个函数都有自己的作用域。函数调用不与它共享它的范围。如果您想通过范围共享变量,您必须将它们放在共享范围中,如下所示:

      var x = 'x from shared scope';
      var a = {
        aFunc: function() {
          console.log('aFunc: ' + x);
        }
      };
      var b = {
        bFunc: function() {
          var x = 'x only in scope b';
          console.log('bFunc: '+ x);
          a.aFunc(); 
        }
      };
      
      b.bFunc();

      【讨论】:

        猜你喜欢
        • 2015-10-03
        • 2016-06-17
        • 1970-01-01
        • 2021-02-03
        • 2015-05-02
        • 2011-09-10
        • 1970-01-01
        相关资源
        最近更新 更多