我有:
var Init = (function() {
my js goes here
})();
当页面加载时,我的 JS 正确执行。 我也有:
$('form :checkbox').change(function() {
Init();
});
但是 Firebug 说
Init
不是一个函数。
这不是一个函数。
(function() {
...
})()
立即评估匿名函数。并且在这种情况下评估结果显然不会返回函数对象:-)
考虑:
f = (function() {
return "not a function :("
})()
alert(f())
和
f = (function() {
return function () { return "Yay!" }
})()
alert(f())
快乐编码:)
“您可以[分配]一个函数或调用它;您不能两者兼而有之......”。)但是,我不会这样做。
Init = (function () {
function Init () {
alert("whee!")
}
Init()
return Init
})()
Init()
这是 CD Sanchez 的另一个解决方案(更短/更清晰)(请参阅评论),它利用了赋值计算为指定值的事实:
var Init; (Init = function Init () {
alert ("wee");
})()
Init
作为函数执行,自执行函数中的代码必须返回一个函数,这样做的唯一原因是如果您需要根据某些数据状态动态构造特定函数:
var Init = (function() {
// some code
return function () {
// some dynamic code dependent upon your previous code
};
}());
Init
不是函数;这是调用函数的结果。您可以创建一个函数或调用它;你不能同时做这两件事。
从技术上讲,您可以通过添加
return arguments.callee;
来从调用中返回函数来解决此问题。然而,这是一个愚蠢的想法。
var Init = function() {
my js goes here
});
并在加载时调用 Init
function Init(){...}();
没有什么可以阻止你拥有一个命名的自动执行函数。 如果您想避免使用名为 Init 的函数,您可以按照 CD Sanchez 的建议进行操作并在执行中分配它。
();最后让它自动执行。 将函数括在括号中使其成为匿名函数。 但看来你不希望它是匿名的。
(function Init(){
/*...*/
})();
但这会减少该函数在其体内的使用
另一种方法是将声明与执行分开:
var Init = function(){
/*...*/
},
initResult = (function(){ return Init(); })();