Javascript 闭包混淆

标签 javascript closures

有人可以解释为什么在 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,必须按顺序查找

  1. public 函数本身
  2. 在紧邻的外部作用域中,这是您用来构建方法 对象的闭包。函数在那里找到
  3. 如果没有找到外层作用域(可能是全局作用域)则依次搜索

关于Javascript 闭包混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21051039/

相关文章:

python - 有人可以向我解释函数对象和闭包之间的区别吗

swift - 我不明白这个类中的参数(Swift)

c++ - Lambda 没有正确捕获变量

javascript - 如何使用 ajax 调用更新/更改数据库值而不刷新页面

javascript - Ajax 回调未执行

javascript - 自定义响应式下拉菜单

swift - 如何异步返回 View ?什么?

javascript - 如何从 JavaScript 闭包中紧凑地返回对象?

javascript - 尝试通过 javascript 中的 .charCodeAt 将此凯撒密码 arr 重新转换为字符

javascript - 动画 toggleClass Display None/Block