javascript - setTimeout 如何查看模块内的私有(private)函数?

标签 javascript module scope closures settimeout

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

最佳答案

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

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

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

关于javascript - setTimeout 如何查看模块内的私有(private)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32428420/

相关文章:

c - 在同一作用域内声明两个或多个同名变量

javascript - 如何限制在文本区域中输入的字符数

javascript - 为什么 javascript Number 函数返回该数字的错误值?

javascript - 用 Javascript 编写真正私有(private)的函数

node.js - 如何为同级目录中所需的脚本提供模块依赖项

php - 使变量可用于所有类、方法、函数和包含,就像 $_POST

javascript - jquery ajax POST方法不执行函数

javascript - Soup - 带身份验证的 POST 请求

Python:从另一个目录导入文件

javascript - 具有 setTimeout 和clearTimeout 的变量范围