2013-11-03 40 views
6

我知道,这可以为匿名函数执行命名函数声明之后

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

我有,我想在其他地方使用函数来完成,但也应立即执行。是否可以用一条语句代替?返回值是不需要的。

function toBeExecutedImmediately() { 
    // Code 
}; 

toBeExecutedImmediately(); 
+3

第一个不是一个匿名函数。它有一个名字。 – Joren

+0

你已经解决了,你只需要尝试一下。 – Theraot

+2

@wared:不,名称'toBeExecutedImmediately'不会被添加到包含的范围,因此它在其他地方不可用。 –

回答

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来调用它。 (你可以在这里使用一个命名函数表达式太,但当然,这会破坏目标  —没有重复的名字  —据我所知)。


旁注:你的第一个例子是不是“一个匿名功能“。该函数有一个专有名称,它是一个名为函数表达式的。只是使用命名函数表达式,与函数声明不同,该名称不会添加到包含范围中。

+0

我不知道*破碎引擎*部分,这很有趣! – xiankai

+0

@xiankai:是的,IE8和更早的**真的**得到命名函数表达式错误,详细信息:http://blog.niftysnippets.org/2010/09/double-take.html他们实际上创建两个不同的函数,在不同的倍。 –

+0

这是一个很好的答案。请在第二个示例中的'toBeExecutedImmediately' var中为匿名函数添加名称(与var名称相同,就像函数声明一样)*。 –

1

你可以写排序 “功能建设者” 像这样的:

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

用法:

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

Live test case

这将使用给定名称将该函数添加到全局window作用域并立即执行它。

+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

+0

如果你不想要一个全局函数怎么办? –

+0

@JoeSimmons只需使用本地命名空间:) – leaf

+0

....真的吗?显然我知道这一点。如果我不想要全局函数会怎么样?如果我想在另一个函数的范围内定义'say'函数呢?没有从语言内部可访问的名称空间。 –