23

我有:

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

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

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

但是萤火虫说 Init 不是一个函数。

4

6 回答 6

56

它不是一个函数。

(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");
})()
于 2011-05-22T21:33:24.173 回答
2

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

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

从技术上讲,您可以通过添加return arguments.callee;以从调用中返回函数来解决此问题。
然而,这是一个愚蠢的想法。

您可能不应该调用该函数;您需要了解您希望代码执行的操作。

于 2011-05-22T21:32:53.570 回答
2

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

var Init = (function() {

    // some code

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

}());
于 2011-05-22T21:35:34.733 回答
1

快速一个尝试像这样更换

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

并在加载调用初始化

于 2011-05-22T21:33:59.930 回答
1

你可以像上面那样做,但你也可以做

function Init(){...}(); 

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

这 (); 最后让它自动执行。将函数括在括号中使其匿名。但是您似乎不希望它是匿名的。

于 2012-08-16T21:05:49.697 回答
0

您可以尝试这样声明:

(function Init(){ 
    /*...*/ 
})();

但这会减少此功能在其体内的使用

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

var Init = function(){
    /*...*/
    },
    initResult = (function(){ return Init(); })();
于 2011-05-22T21:38:16.650 回答