繁体   English   中英

为什么javascript的Closure属性不能与父对象一起使用

[英]Why Closure property of javascript does not work with parent object

根据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具有此属性(我们称其为Closure属性)。

但是在第一种情况下,当外部实际上是一个对象时,内部函数就无法访问父对象的变量(因为它可以访问外部函数的变量)。

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

它不违反第一种情况下的关闭属性吗?

是,因为错误显示消息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)); 
      }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM