【问题标题】:How is setTimeout able to see a private function within a Module?setTimeout 如何能够看到模块中的私有函数?
【发布时间】:2015-12-02 09:42:30
【问题描述】:

我花了很多时间来理解 this、func.bind(this)、func.bind(exports) 和 function() { that.func(); }。但是,我无法理解的是,当模块中没有为它定义导出时,以下 setTimeout 如何能够在私有范围内查看和访问 doStuff()?

window.TestModule = (function() {
    function init() {
        document.getElementById('testbt').onclick = test;
    }

    function test() {
        setTimeout(function() {
            alert(this);        //window
            doStuff();          //works! wow!
        }, 250);
    }

    function doStuff() {
        //do stuff
    }

    return {
        init: init
    };
}());

TestModule.init();

【问题讨论】:

    标签: javascript module scope closures settimeout


    【解决方案1】:

    doStuff 在范围内,这就是原因。它在setTimeout(function(){}) 中找不到它,因此它会查找下一个范围。它在function test () {} 中找不到它,因此它会查找下一个范围。它在(function(){})() 中找到它并使用该定义。

    如果您没有定义doStuff,它会抛出ReferenceError,因为它最终会到达window 范围而没有找到它,并且不会有下一个范围可供查找。


    另外,我认为那不是您的真实代码;它有语法错误。介意发布一个实际的工作场景吗?

    【讨论】:

    • 我会发布真实世界的示例,但它非常庞大。您认为上述设计模式有什么问题吗?真是太棒了,onclick 事件中没有这个/exports了!
    • 不,似乎没有错……除了角落里潜伏的语法错误。
    • 如果还有一个函数window.doStuff,它会调用window.doStuff而不是私有的吗?
    • 不,它会调用私有的,因为私有doStuff的作用域比window.doStuff更接近当前作用域。
    • 这个概念叫什么?
    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 2012-01-24
    • 2019-09-13
    • 1970-01-01
    • 2014-07-20
    • 2020-12-17
    相关资源
    最近更新 更多