我知道这可以用于匿名函数
(function toBeExecutedImmediately() {
// Code
}());
我有一个我希望在其他地方使用的功能,但也应立即执行。是否可以使用一个语句而不是以下来执行此操作?不需要返回值。
function toBeExecutedImmediately() {
// Code
};
toBeExecutedImmediately();
答案 0 :(得分:4)
是否可以使用一个语句而不是以下语句来执行此操作?
没有。正如您所发现的那样,命名函数表达式(您的第一个示例)不会将名称添加到包含范围(broken engines除外 - 我正在看着您,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
进行调用。 (你也可以在这里使用一个命名的函数表达式,但当然这会打败目标 - 不重复这个名字 - 正如我所理解的那样。)
旁注:您的第一个示例不是“匿名函数”。该函数具有正确的名称,它是名为的函数表达式。只是使用命名函数表达式,与函数声明不同,该名称不会添加到包含范围。
答案 1 :(得分: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
答案 2 :(得分:1)
您可以像这样编写“函数构建器”:
function DeclareAndExecute(name, func) {
window[name] = func;
func();
}
用法:
DeclareAndExecute("toBeExecutedImmediately", function() {
//code here
});
这将使用给定名称将函数添加到全局window
范围并执行它。