【问题标题】:self executing function invoked explicitly with call method [duplicate]使用调用方法显式调用的自执行函数[重复]
【发布时间】:2015-02-05 14:48:40
【问题描述】:

我见过大量的 javascript 代码使用自执行函数,例如:

(function(){
    // ... code here
})();

但偶尔,我看到人们这样做:

(function(){
    // ... code here
}).call(this);

这两种形式在功能上有区别吗?如果有,是什么?

第二种形式的例子:https://github.com/shawnmclean/Idle.js/blob/master/build/idle.js#L160

【问题讨论】:

    标签: javascript


    【解决方案1】:

    第二种形式将this 的值传递给IIFE,因此IIFE 内部的this 将具有与IIFE 外部相同的值。在很多情况下这不会产生影响,但如果 IIFE 位于 this 设置为某个有意义值的范围内,则第二种形式将在 IIFE 内保留 this 的值。

    如果外部范围内的this 是全局对象并且您没有运行严格模式,那么第二种形式不会真正改变任何东西,因为this 仍然是 IIFE 内的全局对象。

    但是,如果this 在严格模式下是任何有意义的值,或者在非严格模式下是除全局对象之外的任何有意义的值,那么第二种形式会将this 的值扩展到外壳中。

    在您指向的示例中,我的猜测是第二种形式只是被用作一种常见的设计模式,而不是因为在这种特殊情况下确实有理由这样做。实际上,如果您查看您指向的代码示例,它甚至没有使用 IIFE 顶层的 this 的值,因此在该特定示例中绝对是多余的。

    【讨论】:

    • 在什么情况下 this 没有设置为“有意义的值”?
    • @RobG - 在严格模式下,this 通常是 undefined(例如在任何正常的函数调用中)。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2021-08-29
    相关资源
    最近更新 更多