【问题标题】:Why Closure property of javascript does not work with parent object为什么javascript的闭包属性不适用于父对象
【发布时间】:2014-11-07 06:56:03
【问题描述】:

根据javascript中闭包的定义: 闭包是一个内部函数,它可以访问外部(封闭)函数的变量——作用域链。

因为在 javascript 中一切都是对象,甚至函数。 我的问题是,当涉及到绑定时,对象(比如 foo)内部的函数(比如 bar)不能直接访问对象的属性。 例如:

   var foo= {
   tmp: 3,
   x:2,
  bar: function(y) {
    console.log(x + y + (++tmp)); 
  }

}

执行时

foo.bar(10)

它给出了无法识别 x & tmp 的错误。

但是现在当上面的代码是这样写的时候

function foo(x) {
   tmp: 3,
   bar: function(y) {
    console.log(x + y + (++tmp)); 
    }
    bar(10);
  }

然后执行

foo(2);

它没有抱怨并给出输出 16

我可以理解,在第二种情况下它能够访问父函数的变量,因为 JavaScript 有这个属性(我们称之为闭包属性)。

但是在第一种情况下,外部实际上是一个对象,那么内部函数不能访问父对象的变量(因为它可以访问外部函数的变量)。

虽然我知道解决方法是使用此关键字访问外部对象变量。但问题仍然存在。

第一种情况不违反闭包的性质吗?

【问题讨论】:

  • 谁能解释一下?

标签: javascript closures


【解决方案1】:

是的,因为错误显示消息 x 未定义,因为在

var foo= {
   tmp: 3,
   x:2,
   bar: function(y) {
    console.log(x + y + (++tmp)); 
  }
}

tmpx 是 foo 的对象而不是 bar 的局部变量。而 foo 是 bar 的父级,它可以使用 this 运算符访问,您可以在下面的示例中看到它。

var foo= {
    tmp: 3,
    x:2,
    bar: function(y) {
        console.log(this.x + y + (++this.tmp)); 
      }
}

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 2021-05-26
    • 1970-01-01
    • 2015-04-16
    • 2015-09-26
    • 2017-09-09
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多