在声明命名函数后执行该函数

Executing a named function after declaring it

本文关键字:函数 执行 声明      更新时间:2023-09-26

我知道这可以用于匿名函数

(function toBeExecutedImmediately() {
    // Code
}());

我有一个函数,我希望在其他地方使用,但也应该立即执行。是否可以用一个语句而不是以下语句来做到这一点?不需要返回值。

function toBeExecutedImmediately() {
    // Code
};
toBeExecutedImmediately();

是否可以用一个语句而不是以下语句来做到这一点?

不。正如你所发现的,命名函数表达式(你的第一个示例)不会将名称添加到包含范围(除了在损坏的引擎 上 - 我正在看你,IE8 及更早版本),所以你不能在不做一些事情的情况下在其他地方调用函数来实现这一点,当然对于函数声明(你的第二个示例),你必须给出两次名称。

你最好的选择可能是继续做声明和单独的调用(你的第二个例子)。

我们可能会想出一些复杂的东西,从技术上讲符合"单个语句"的定义,但它不太可能更短。

如果您的目标是简洁,那么这是两个陈述,但很简短:

var f = function() {
    // Code
}, toBeExecutedImmediately = f;
f();

但是,虽然相对简短,但我会说清晰度受到影响。

当然,如果您添加帮助程序函数,一切皆有可能。例如:

// The helper
function defineAndExecute(f) {
    f();
    return f;
}
// using it
var toBeExecutedImmediately = defineAndExecute(function() {
    // Do work here
});

该函数在技术上是匿名的,但您可以通过 var 调用它。(你也可以在这里使用命名函数表达式,但当然,据我所知,这会破坏目标 ——而不是重复名称 。


旁注:您的第一个示例不是"匿名函数"。该函数有一个专有名称,它是一个命名函数表达式。只是对于命名函数表达式,与函数声明不同,该名称不会添加到包含范围。

您可以使用命名空间:

// alerts "say yes"
(window.say = function (s) { alert('say ' + s); })('yes');
// alerts "say something"
say('something');

作为对评论的回复,这里是如何使函数本地化:

(function(){
    var dontSay;
    // alerts "don't say no"
    (dontSay = function (s) { alert('don''t say ' + s); })('no'); 
    // alerts "don't say anything"
    dontSay('anything');
})();

@JoeSimmons 这确实不是一场革命,但这个问题也不是真正重要的;D

你可以像这样写"函数生成器":

function DeclareAndExecute(name, func) {
    window[name] = func;
    func();
}

用法:

DeclareAndExecute("toBeExecutedImmediately", function() {
    //code here
});

实时测试用例。

这会使用给定的名称将函数添加到全局window范围并 insta-execute 它。