我正在尝试编写一个立即执行的函数,但也可以稍后执行:
var test = function (e){ console.log('hello'+e); }(); $('#some_element').click(function(e){ test(' world'); });
在这种情况下,我想要的结果是:
helloundefined hello world
我没有理解为什么稍后调用test会返回'test is not a function'。
答案 0 :(得分:5)
您可以像这样定义test
:
var test = function (e){ console.log('hello'+e); }();
这会创建一个闭包,然后立即调用它。由于闭包中没有明确的return
,因此返回undefined
。现在test
包含undefined
。之后,在传递给click
的闭包中,它尝试调用test
。 test
仍为undefined
。你最终会做这样的事情:
undefined(' world');
你说你希望它输出:
helloundefined
hello world
在这种情况下,你可以这样做:
var test = function test(e) { console.log('hello'+e); return test; }();
作为一个副作用,它也使test
可链接,所以你可以这样做:
test(" world")(" stack overflow")(" internet");
结果(不包括第一个helloundefined
)将是:
hello world
hello stack overflow
hello internet
答案 1 :(得分:4)
var test = function (e){ console.log('hello'+e); }();
最后那些parens意味着test
是评估函数调用的结果(换句话说是函数的返回值),而不是函数本身。
试试这个:
var testFunc = function (e){ console.log('hello'+e); };
testFunc();
$('#some_element').click(function(e){
testFunc(' world');
});
答案 2 :(得分:3)
var test;
(test = function( e ) { console.log('hello'+e); } )(); //helloundefined
test( ' world' ); //hello world
答案 3 :(得分:1)
您要将函数的返回值分配给test
,而不是函数本身。如果您还想将其分配给变量,我认为您不能使用自执行快捷方式。你需要这样做:
var test = function (e){ console.log('hello'+e); };
test();
$('#some_element').click(function(e){
test(' world');
});