6

我知道这可以为匿名函数完成

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

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

function toBeExecutedImmediately() {
    // Code
};

toBeExecutedImmediately();
4

3 回答 3

4

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

不。正如您所发现的,命名函数表达式(您的第一个示例)不会将名称添加到包含范围(除了损坏的引擎 - 我正在看着您,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. (您也可以在这里使用命名函数表达式,但当然这会破坏目标 - 不重复名称 - 正如我所理解的那样。)


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

于 2013-11-03T11:21:38.640 回答
2

您可以使用命名空间:

// 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

于 2013-11-03T11:34:30.887 回答
1

您可以像这样编写某种“函数构建器”:

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

用法:

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

现场测试用例

这将使用给定名称将函数添加到全局window范围并立即执行。

于 2013-11-03T11:25:41.657 回答