为什么javascript的Closure属性不适用于父对象

时间:2014-11-07 06:56:04

标签: javascript closures

根据javascript关闭的定义: 闭包是一个内部函数,可以访问外部(封闭)函数的变量范围链。

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

   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具有这个属性(我们称之为闭包属性)。

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

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

在第一种情况下是否违反了封闭属性?

1 个答案:

答案 0 :(得分: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)); 
      }
}