【发布时间】: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