我知道,这可以为匿名函数执行命名函数声明之后
(function toBeExecutedImmediately() {
// Code
}());
我有,我想在其他地方使用函数来完成,但也应立即执行。是否可以用一条语句代替?返回值是不需要的。
function toBeExecutedImmediately() {
// Code
};
toBeExecutedImmediately();
我知道,这可以为匿名函数执行命名函数声明之后
(function toBeExecutedImmediately() {
// Code
}());
我有,我想在其他地方使用函数来完成,但也应立即执行。是否可以用一条语句代替?返回值是不需要的。
function toBeExecutedImmediately() {
// Code
};
toBeExecutedImmediately();
是否有可能有一个说法,而不是下面做呢?
号正如您看到的,指定的函数表达式(你的第一个例子)名称不添加到包含范围(除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
来调用它。 (你可以在这里使用一个命名函数表达式太,但当然,这会破坏目标 —没有重复的名字 —据我所知)。
旁注:你的第一个例子是不是“一个匿名功能“。该函数有一个专有名称,它是一个名为函数表达式的。只是使用命名函数表达式,与函数声明不同,该名称不会添加到包含范围中。
我不知道*破碎引擎*部分,这很有趣! – xiankai
@xiankai:是的,IE8和更早的**真的**得到命名函数表达式错误,详细信息:http://blog.niftysnippets.org/2010/09/double-take.html他们实际上创建两个不同的函数,在不同的倍。 –
这是一个很好的答案。请在第二个示例中的'toBeExecutedImmediately' var中为匿名函数添加名称(与var名称相同,就像函数声明一样)*。 –
你可以写排序 “功能建设者” 像这样的:
function DeclareAndExecute(name, func) {
window[name] = func;
func();
}
用法:
DeclareAndExecute("toBeExecutedImmediately", function() {
//code here
});
这将使用给定名称将该函数添加到全局window
作用域并立即执行它。
好吧,当然。有可能创建一些不依赖于全局功能的东西。 –
你可以使用一个命名空间:
// 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
如果你不想要一个全局函数怎么办? –
@JoeSimmons只需使用本地命名空间:) – leaf
....真的吗?显然我知道这一点。如果我不想要全局函数会怎么样?如果我想在另一个函数的范围内定义'say'函数呢?没有从语言内部可访问的名称空间。 –
第一个不是一个匿名函数。它有一个名字。 – Joren
你已经解决了,你只需要尝试一下。 – Theraot
@wared:不,名称'toBeExecutedImmediately'不会被添加到包含的范围,因此它在其他地方不可用。 –