【发布时间】:2011-08-30 18:14:19
【问题描述】:
我有:
var Init = (function() {
my js goes here
})();
当页面加载时,我的 js 会正确执行。我也有:
$('form :checkbox').change(function() {
Init();
});
但是萤火虫说 Init 不是一个函数。
【问题讨论】:
标签: javascript iife
我有:
var Init = (function() {
my js goes here
})();
当页面加载时,我的 js 会正确执行。我也有:
$('form :checkbox').change(function() {
Init();
});
但是萤火虫说 Init 不是一个函数。
【问题讨论】:
标签: javascript iife
这不是一个函数。
(function() {
...
})()
评估匿名函数然后。 在这种情况下,评估结果显然不会返回函数对象 :-)
考虑:
f = (function() {
return "not a function :("
})()
alert(f())
和
f = (function() {
return function () { return "Yay!" }
})()
alert(f())
编码愉快:)
这是一个函数,它会“执行一次”,然后“返回那个稍后执行”。 (请参阅 “你可以 [分配] 一个函数或调用它;你不能同时做这两个......”来自 Slaks 的回答。)但是,我不会这样做。 p>
Init = (function () {
function Init () {
alert("whee!")
}
Init()
return Init
})()
Init()
这是 CD Sanchez 的另一种解决方案(更短/更简洁)(见评论),它利用了赋值计算为赋值的事实:
var Init; (Init = function Init () {
alert ("wee");
})()
【讨论】:
var Init; (Init = function () { alert ("wee"); })()
function Init(){} Init();?它使意图更加清晰。
为了让Init 作为函数执行,自执行函数中的代码必须返回一个函数,这样做的唯一原因是如果您需要根据某些数据状态动态构造特定函数:
var Init = (function() {
// some code
return function () {
// some dynamic code dependent upon your previous code
};
}());
【讨论】:
Init 不是函数;这是调用函数的结果。
您可以创建一个函数或调用它;你不能同时做这两件事。
从技术上讲,您可以通过添加 return arguments.callee; 以从调用中返回函数来解决此问题。
然而,这是一个愚蠢的想法。
您可能不应该调用该函数;您需要了解您希望代码做什么。
【讨论】:
you can't do both at once - 是的,你可以:(function Init(){ /*...*/ })();
var Init; (Init = function () { ... })(); 请注意(var Init = ...)() 无效,因为var 语句不是表达式。
Init。这就是问题中的问题。注释中的代码中不需要括号。
快速的 尝试像这样替换
var Init = function() {
my js goes here
});
加载调用初始化
【讨论】:
你可以这样做,但你也可以这样做
function Init(){...}();
没有什么可以阻止您拥有一个命名的自执行函数。 如果您想避免使用名为 Init 的函数,您可以按照 CD Sanchez 的建议进行操作并在执行时分配它。
();最后让它自动执行。将函数括在括号中使其匿名。但您似乎不希望它是匿名的。
【讨论】:
你可以尝试这样声明:
(function Init(){
/*...*/
})();
但这会减少这个函数在它的主体中的使用
另一种方法是将声明与执行分开:
var Init = function(){
/*...*/
},
initResult = (function(){ return Init(); })();
【讨论】:
Init 不会使用它在封闭范围内定义。也许您的意思是:var Init; (Init = function () { ... })();?
Init 不会像 OP 想要的那样在封闭范围内可用。
Init 的函数。
Init 中,然后执行赋值表达式的结果(这将是function () {} 部分)。我过去曾使用过它,并且效果很好。不过,我并非万无一失 - 如果您发现我的推理有缺陷,请告诉我。