javascript - 立即函数有什么用?

标签 javascript function

<分区>

我从一段时间以来一直在使用 JS 编程,但是我从来没有遇到过使用立即函数的需要,例如:

(function(){
    console.log('hello, I am an immediate function');
}())

如果我只写会有什么区别:

console.log('hello, I am an immediate function');

?无论如何,我无权访问此功能(它未分配到任何地方)。我认为(但我不确定)我可以在没有直接功能的情况下实现一切 - 那么人们为什么要使用它?

最佳答案

更新:
我找到了 this question我确实在其中详细介绍了闭包,并附上了一些小图来阐明如何使用闭包和函数作用域(以及它们如何帮助您)。

IIFE 作为函数对象,是在 JS 中创建真实作用域的唯一方法。它们到处都在使用。你用过 jQuery 或其他库吗?那么您已经使用了使用 IIFE 的代码。
曾经研究过 node.js 吗?那么您可能会遇到一种叫做“模块模式”的东西。
如果您尝试过编写自己的构造函数,您可能想知道如何在对象上拥有某种私有(private)属性。答案是IIFE一次又一次。

另外:DOM api 并不是世界上最快的。拥有一个包含硬编码的 document.getElementById 调用的函数意味着,每次调用该函数时,都会遍历 DOM。这并不理想。解决此问题的一种快速简便的方法是:

var f = (function(domReference)
{
    var visible = !!(domReference.style.visibility === 'block')
    return function()
    {//has access to vars and arguments of outer function
        domReference.style.visibility = visible ? 'none' : 'block';
        visible = !visible;
    }
}(document.getElementById('foobar'));

但也许最好、最常见的例子是循环中的超时/间隔:

for (var i=0;i<10;i++)
{
    setTimeout((function(currentI)
    {
        return function()
        {
            console.log(currentI);
            console.log(i);
        }
    }(i)), 1000);

在这里,currentI 将记录 0、1、2... 等等,而 i始终记录 10 。原因是超时回调没有得到它自己的i 值的副本,但它引用变量i。该变量可以根据需要更改其值,当调用超时回调时,它将记录上次分配的任何值 i 。不是在定义回调时分配的值 i

我没有详细介绍,只是提到了对象的私有(private)属性。好吧,这里有一个例子可以让你明白为什么 IIFE 和函数作用域是至关重要的,以及 JS 的一个令人难以置信的强大特性:

var MyConstructor = (function()
{
    return function(foo, bar)
    {
        var initState = Array.prototype.slice.apply(arguments, [0]);
        this.getInit = function()
        {
            return initState;
        };
        this.foo = foo;
        this.bar = bar;
    }
}());
(function(constant)
{
    var F = function(args)
    {
        return MyConstructor.apply(this, args);
    },
    checkVar = constant || 'default constant value';
    F.prototype = MyConstructor.prototype;
    MyConstructor.prototype.getConstant = function()
    {
        if (constant !== checkVar)
        {//bad example
            return checkVar;
        }
        return constant;
    };
    MyConstructor.prototype.regularMethod = function()
    {
        return this.foo;
    };
    MyConstructor.prototype.copyFromInitState = function()
    {
        return new F(this.getInit());
    };
}('Immutable value'));

祝你玩得开心...:P

关于javascript - 立即函数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17212557/

相关文章:

javascript - 网页抛出错误 "<function> is not defined."

javascript - JQuery 没有显示正确的十进制输出

javascript - 从网络 worker 运行函数

javascript - 将数学公式转换为 node.js

javascript - Vue 测试 - '... .push is not a function'

python - 对所有可能的参数组合执行函数

javascript - 我如何在angular js中使用带有指令的ng-model

PHP - 设置 file_get_contents 超时

JavaScript倒计时弹出窗口

javascript - 为什么这个条件在没有 else 的 return 语句中起作用?