Javascript自执行功能“不是一个功能”

时间:2011-05-22 21:30:40

标签: javascript iife

我有:

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

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

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

但是萤火虫说Init不是一个功能。

6 个答案:

答案 0 :(得分:54)

这不是一个功能。

(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");
})()

答案 1 :(得分:2)

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

你可以创建一个函数或者调用它;你不能一次做两件事。

从技术上讲,您可以通过添加return arguments.callee;来修复此问题,以便从通话中返回该功能 然而,这是一个愚蠢的想法。

你可能不应该调用这个函数;你需要了解你希望你的代码做什么。

答案 2 :(得分:2)

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

var Init = (function() {

    // some code

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

}());

答案 3 :(得分:1)

快一点 尝试像这样替换

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

并在加载调用Init

答案 4 :(得分:1)

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

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

没有什么可以阻止你拥有一个命名的自执行功能。 如果你想避免使用名为Init的函数,你可以像CD Sanchez建议的那样做,并在执行中分配它。

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

答案 5 :(得分:0)

您可以尝试以这种方式声明:

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

但是这会减少这个功能在身体中的使用

其他方式是将声明与执行分开:

var Init = function(){
    /*...*/
    },
    initResult = (function(){ return Init(); })();