javascript - 立即调用函数表达式 (IIFE) 与非立即调用函数表达式

标签 javascript design-patterns anonymous-function iife

我看到很多这样的代码:

var myApp ={};
(function() {
    console.log("Hello");
    this.var1 = "mark";     //"this" is global, because it runs immediately on load.  Caller is global
    myApp.sayGoodbye = function() {
        console.log("Goodbye");
    };
})();

这会导致匿名函数立即执行。但是,与仅将代码内联相比,这样做的优势是什么?

var myApp ={};
console.log("Hello");
var1 = "mark";     
myApp.sayGoodbye = function() {
    console.log("Goodbye");
};

显然这与函数的作用域有关,但由于该函数是匿名的并由窗口调用,所以它的作用域(即 this)是全局的,不是吗?

最佳答案

通常,你会有这个:

        var myApp ={};
        (function() {
            console.log("Hello");
            var var1 = "mark";  
            myApp.sayGoodbye = function() {
                console.log("Goodbye");
            };
        })();

主要区别在于 var1 不会使全局命名空间困惑。这次调用后,var1还是和之前一样(一般是undefined)。

因为 var1 只能从闭包中定义的函数访问,所以它被称为“私有(private)”。

除了避免可能的冲突原因之外,在无用时不要保留全局变量更清洁。

在这里,您没有局部变量,而是定义为 this.var1 的全局变量。这可能是一个错误,或者可以在代码的其他地方找到原因。

关于javascript - 立即调用函数表达式 (IIFE) 与非立即调用函数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14317998/

相关文章:

javascript - 使用 onClick 事件时函数仅执行一次 [javascript]

c# - 串行终端应用程序的设计模式

java - 如何确保构建器模式完成?

c# - 网站的 WCF 设计模式

javascript - 了解有关闭包的匿名 JavaScript 函数定义

c# - Action/delegate 可以更改它的参数值吗?

javascript - 当窗口太小时如何更改 HTML 元素?

javascript - 无法为自定义字段 Dynamics 365 设置值

javascript - 通过Chart.js创建多个图表

Elixir 中的递归和匿名函数