有人可以解释为什么在 Javascript 中会出现这种情况吗?
var singleton = window.singleton || {};
singleton.methods = (function () {
var _private = function() {
console.log('outer private function');
}
return {
_private: function() {
console.log('inner private');
},
public: function() {
_private();
}
}
})();
singleton.methods.public();
我的直觉使我相信调用 .public()
应该记录“inner private”。它没有。如果我将 public()
定义更改为 this._private()
,我会得到我期望的结果。为什么?
最佳答案
你有一个范围问题:_private
在你的 public
函数中指的是在构造闭包中定义的那个(闭包是由函数调用定义的,你的 block return 没有定义范围)。
如果要记录返回对象的_private
方法,把定义改成
return {
_private: function() {
console.log('inner private');
},
public: function() {
this._private();
}
}
这是 what the MDN says about closures :
In short, variables from the parent function of the closure remain bound from the parent's scope.
在public
函数中解析_private
,必须按顺序查找
- 在
public
函数本身 - 在紧邻的外部作用域中,这是您用来构建
方法
对象的闭包。函数在那里找到 - 如果没有找到外层作用域(可能是全局作用域)则依次搜索
关于Javascript 闭包混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21051039/