javascript - 函数的括号包裹 - (function() { }) () 和 `.call()`

标签 javascript coffeescript

我编写 javascript 已经有一段时间了,最​​近一直在使用 Coffeescript。我注意到 CoffeeScript 按以下方式编译函数:

(function() {

}).call()

我还注意到人们以这种方式编写函数:

(function() {

})()

据我了解,这些是调用自身的匿名函数。首先,有 .call() 和只有 () 之间的区别是什么 .call() 只是一种更语义化的书写方式().

另外,为什么coffeescript 将整个文件包装在匿名函数中,而通常不需要这样做?这有什么性能或其他优势吗?什么时候应该使用这些自调用匿名函数?

谢谢

最佳答案

使用.call()将IIFE的上下文更改为父作用域的this值。

第一个this将是[object Window],浏览器环境中的全局范围:

(function () {

    console.log(this);

})();

第二个将完全相同:

(function () {

    console.log(this);

}).call(this);

不同之处在于,在 ECMAScript 5 的严格模式中,第一个示例 this 将是未定义的:

(function () {

    'use strict';

    console.log(this); // undefined

})();

但是,当使用严格模式 .call() 时,这又是具有正确 this 上下文的全局范围:

(function () {

    'use strict';

    console.log(this);

}).call(this);

Here's a jsFiddle显示这个。主要区别在于,普通 IIFE 丢失了它的 this 上下文,一些 CommonJS 平台使用特定的 this 评估文件。

CoffeeScript 这样做是为了确保您的代码与它所在的作用域(父作用域)具有相同的 this 上下文 - 因为函数通常不会继承其 this 来自周围环境的对象。

使用上面的模式,您应该将函数逻辑包装在其中,以避免将所有代码放在全局范围内并出现变量/命名冲突,然后您可以创建诸如模块之类的内容并仅返回您需要的 API,例如:

var Module = (function () {

    'use strict';

    return {
        someMethod: function () {
            // do something
        }
    }

})();

// call it:
Module.someMethod();

每个函数都会创建自己的作用域,因此将代码块包装在其中将保护您的变量/函数名称免于相互冲突。我们还可以从这些闭包中访问“私有(private)”方法:

var Module = (function () {

    'use strict';

    var _privateMethod = function () {};

    return {
        someMethod: function () {
            _privateMethod();
        }
    }

})();

当我们不希望我们的用户也公开访问这些方法时,我们会这样做。

关于javascript - 函数的括号包裹 - (function() { }) () 和 `.call()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402599/

相关文章:

javascript - 如果从短信中的链接打开站点,则在触摸之前不会触发 beforeinstallprompt

javascript - 我可以使用 rx.js 观察数组的添加吗?

javascript - CoffeeScript 切换无中断

javascript - 监视 sinon 中的 CoffeeScript 构造函数

javascript - 在 coffeescript 中以编程方式调用函数/"by string"

javascript - 直接使用对象

javascript - 在 JavaScript 中,我不明白下面代码的输出

javascript - Odoo 将小部件添加到网站前端

javascript - 组合多个元素的 jQuery 事件监听器

javascript - 指定 Ionic ionic 装载容器