根据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具有这个属性(我们称之为闭包属性)。
但是在第一种情况下,当外部实际上是一个对象时,内部函数无法访问父对象的变量(因为它可以访问外部函数的变量)。
虽然我知道解决方法是使用此关键字访问外部对象变量。但问题仍然存在。
在第一种情况下是否违反了封闭属性?
答案 0 :(得分:1)
是的,因为错误显示消息x未定义,因为在
中var foo= {
tmp: 3,
x:2,
bar: function(y) {
console.log(x + y + (++tmp));
}
}
因为tmp
和x
是foo的对象而不是bar的局部变量。并且foo是bar的父级,它可以使用this
运算符访问,您可以在下面看到它示例
var foo= {
tmp: 3,
x:2,
bar: function(y) {
console.log(this.x + y + (++this.tmp));
}
}