我知道这可以为匿名函数完成
(function toBeExecutedImmediately() {
// Code
}());
我有一个希望在其他地方使用的功能,但也应该立即执行。是否可以用一个语句而不是以下语句来做到这一点?不需要返回值。
function toBeExecutedImmediately() {
// Code
};
toBeExecutedImmediately();
我知道这可以为匿名函数完成
(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
范围并立即执行。