为什么这个:
(function () {
//code
}());
Run Code Online (Sandbox Code Playgroud)
还有这个:
var f = function () {
//code
}();
Run Code Online (Sandbox Code Playgroud)
工作,而这:
function () {
//code
}();
Run Code Online (Sandbox Code Playgroud)
才不是?它看起来完全一样 - 定义了匿名函数,并立即调用.有人可以从JavaScript/ECMAScript标准中引用它来解释这个吗?
更新:感谢大家的答案!所以这是关于函数表达式与函数声明的关系.请参阅此Stack Overflow答案,ECMAScript标准第13节,以及这篇精彩文章:命名函数表达式揭秘.
回顾一下答案:
第一个片段被解释为表达式,因为应用了分组运算符()- 请参阅ECMAScript标准第11.1.6节.
在第二个片段中,函数被解释为表达式,因为它位于赋值运算符的右侧部分=.
第三个片段没有任何允许解释器将函数作为表达式读取的东西,因此它被认为是一个声明,如果没有标识符则无效(Gecko允许它通过,但它会跟随下面的()分组操作符(因为它认为) )什么都不适用).
这段代码也引用了什么?
queryString: function() {
//some code
}
Run Code Online (Sandbox Code Playgroud)
我在WebConsole(Firefox)中对它进行了测试,但它不会执行,因此我认为它不等同于function queryString() {}.
那究竟是什么?
考虑以下代码段:
# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
self.command["cd " + d] = (lambda : self.root.change_directory(d))
Run Code Online (Sandbox Code Playgroud)
我希望创建一个包含两个函数的字典如下:
# Expected :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("home")
}
Run Code Online (Sandbox Code Playgroud)
但看起来生成的两个lambda函数完全相同:
# Result :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("login") # <- Why login ?
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么.你有什么建议吗 ?
我想传递两个匿名函数作为jQuery的悬停的参数,如下所示:
$('element').hover(
function() {
// do stuff on mouseover
},
function() {
// do stuff on mouseout
}
);
Run Code Online (Sandbox Code Playgroud)
只用一个就很容易hover ->- 但是CoffeeScript中的两个正确语法是什么?我试过...hover ->,...hover( ->...等等,但没有任何东西让我得到上述结构.
是否可以将函数放在数据结构中,而不是先给它命名def?
# This is the behaviour I want. Prints "hi".
def myprint(msg):
print msg
f_list = [ myprint ]
f_list[0]('hi')
# The word "myprint" is never used again. Why litter the namespace with it?
Run Code Online (Sandbox Code Playgroud)
lambda函数的主体受到严格限制,所以我不能使用它们.
编辑:作为参考,这更像是我遇到问题的现实代码.
def handle_message( msg ):
print msg
def handle_warning( msg ):
global num_warnings, num_fatals
num_warnings += 1
if ( is_fatal( msg ) ):
num_fatals += 1
handlers = (
( re.compile( '^<\w+> (.*)' ), handle_message ),
( re.compile( '^\*{3} (.*)' ), handle_warning ), …Run Code Online (Sandbox Code Playgroud) 当我遇到调用匿名函数的奇怪方式时,我正在阅读Twitter上的JS源代码 - 在改进我的JS知识库的过程中:
!function( $ ) {
...
}( window.jQuery );
Run Code Online (Sandbox Code Playgroud)
......这有效!:)
对每个人来说,显而易见的是:
function ( $ ) { ... } ( window.jQuery )
Run Code Online (Sandbox Code Playgroud)
不起作用(语法错误),而这一个是正确的:
(function ( $ ) { .... })( window.jQuery )
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个魔术(为什么案例与!function作品)?
我很快就想确定是否/何时触发了一组事件.因此我很快给他们分配了空的lambda.
_session.TopologyStarted += () => { };
Run Code Online (Sandbox Code Playgroud)
在触发事件时跟踪代码时,调试器进入匿名函数,允许调试它的执行.但是,在此代码行上设置断点时,会在为事件分配匿名函数时设置断点.
有没有办法在匿名函数中设置断点?
这个问题并不十分具体; 这真的是我自己的C浓缩,我希望其他人也能发现它有用.
免责声明:我知道很多人会有回应的冲动"如果你试图做FP然后只使用一种功能语言".我在一个需要链接到许多其他C库的嵌入式环境中工作,并且没有太多空间用于更多大型共享库,并且不支持许多语言运行时.而且,动态内存分配是不可能的.我也很好奇.
我们中的许多人已经看到了lambda表达式的这个漂亮的C宏:
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
Run Code Online (Sandbox Code Playgroud)
一个示例用法是:
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
Run Code Online (Sandbox Code Playgroud)
使用gcc -std=c89 -E test.c,lambda扩展为:
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
Run Code Online (Sandbox Code Playgroud)
所以,这些是我的问题:
线int(*X)究竟是什么?宣布?当然,int*X; 是指向整数的指针,但这两者有何不同?
看一下这个扩大的宏观,最终会__fn__做什么呢?如果我写一个测试函数 …
可能重复:
你如何在PHP中使用匿名函数?
我为什么要使用匿名函数?我的意思是,使用它的真正优惠是什么?我真的不明白这一点.我的意思是,你使用函数使代码更干净或多次使用它.但匿名函数不是第一个也不是第二个.我用谷歌搜索了他们,我找不到有人问同样的问题.
PHP 5.3提供匿名函数.
我应该使用它们还是避免使用它们?如果是这样,怎么样?
编辑 ; 刚刚用php匿名函数发现了一些不错的技巧......
$container = new DependencyInjectionContainer();
$container->mail = function($container) {};
$conteiner->db = function($container) {};
$container->memcache = function($container) {};
Run Code Online (Sandbox Code Playgroud)