一旦 IIFE 表达式存储在变量中,为什么不能再次调用该函数?

问题描述 投票:0回答:6

我有:

var Init = (function() {
   my js goes here
})();

当页面加载时,我的 JS 正确执行。 我也有:

$('form :checkbox').change(function() {
   Init();
});

但是 Firebug 说

Init
不是一个函数。

javascript iife
6个回答
57
投票

这不是一个函数。

(function() {
   ...
})()

立即评估匿名函数。并且在这种情况下评估结果显然不会返回函数对象:-)

考虑:

f = (function() { return "not a function :(" })() alert(f())

f = (function() { return function () { return "Yay!" } })() alert(f())
快乐编码:)


这是一个函数,它将“执行一次某件事”,然后“返回该事件以供稍后执行”。 (请参阅 Slaks 回答中的

“您可以[分配]一个函数或调用它;您不能两者兼而有之......”。)但是,我不会这样做。

Init = (function () { function Init () { alert("whee!") } Init() return Init })() Init()
这是 CD Sanchez 的另一个解决方案(更短/更清晰)(请参阅评论),它利用了赋值计算为指定值的事实:

var Init; (Init = function Init () { alert ("wee"); })()
    

2
投票
为了让

Init

 作为函数执行,自执行函数中的代码必须返回一个函数,这样做的唯一原因是如果您需要根据某些数据状态动态构造特定函数:

var Init = (function() { // some code return function () { // some dynamic code dependent upon your previous code }; }());
    

2
投票

Init

 不是函数;这是调用函数的结果。

您可以创建一个函数或调用它;你不能同时做这两件事。

从技术上讲,您可以通过添加

return arguments.callee;

 来从调用中返回函数来解决此问题。
然而,这是一个愚蠢的想法。

您可能不应该调用该函数;你需要了解你想要你的代码做什么。


1
投票
快一点 尝试这样替换

var Init = function() { my js goes here });
并在加载时调用 Init 


1
投票
你可以像上面那样做,但你也可以这样做

function Init(){...}();
没有什么可以阻止你拥有一个命名的自动执行函数。
如果您想避免使用名为 Init 的函数,您可以按照 CD Sanchez 的建议进行操作并在执行中分配它。

();最后让它自动执行。 将函数括在括号中使其成为匿名函数。 但看来你不希望它是匿名的。


0
投票
您可以尝试这样声明:

(function Init(){ /*...*/ })();
但这会减少该函数在其体内的使用

另一种方法是将声明与执行分开:

var Init = function(){ /*...*/ }, initResult = (function(){ return Init(); })();
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.