在定义的同时调用一个函数,我一直在使用:
var newfunc = function() {
alert('hi');
};
newfunc();
以下是正确组合这两种方法的方法:
var newfunc = function() {
alert('hi');
}();
答案 0 :(得分:4)
没有。您的第二个示例将立即调用匿名函数并将其返回值分配给newfunc
。
adamse描述了一种似乎有效的方法。我仍然避免这种方法,因为两步过程更容易阅读,因此更容易维护。
答案 1 :(得分:4)
var newfunc = function f() {
alert("hi!");
return f;
}();
具有命名函数表达式允许函数递归调用自身,或者在这种情况下返回自身。然而,这个功能总会自行返回,这可能是一个烦恼。
答案 2 :(得分:3)
您希望这样做有很多原因。我不确定你的是什么,但让我介绍一些最喜欢的模式:
模式#1:单身人士。该函数被执行,然后成为单个对象,供代码的其他组件使用。
var singletonObject = new function() {
// example private variables and functions
var variable1 = {};
var variable2 = {};
var privateFunction = function() {
};
// example public functions
this.getData = function() {
return privateFunction(variable1, variable2);
};
// example initialisation code that will only run once
variable1.isInitialised = true;
};
模式#2:自动执行匿名函数......因为太多原因而非常方便!
// Declare an anonymous function body.
// Wrap it in parenthesis to make it an "expression.
// Execute it by adding "();"
(function(){})();
这是一个为对象创建命名空间的示例。 我使用“NS”作为示例命名空间:
// declare the anonymous function, this time passing in some parameters
(function($, NS) {
// do whatever you like here
// execute the function, passing in the required parameters.
// note that the "NS" namespace is created if it doesn't already exist
})(jQuery, (window.NS = window.NS || {}));
您还可以使用.call或.apply而不是通常的括号来设置自执行函数的上下文,如下所示:
(function($){
// 'this' now refers to the window.NS object
}).call(window.NS = window.NS || {}, jQuery);
或
(function($){
// 'this' now refers to the window.NS object
}).apply(window.NS = window.NS || {}, [jQuery]);
答案 3 :(得分:2)
如果我理解你的问题,请尝试一下:
(f = function (msg) {
msg = msg ? msg : 'default value';
alert(msg); }
)();
f('I\'m not the default value!');
您将收到两个提醒,第一个提示“默认值”,第二个提示“我不是默认值。您可以在jsBin看到它。点击'预览'让它运行。
答案 4 :(得分:-1)
o = {};
o.newfunc = ( function() {
function f() {
alert('hi');
}
f();
return {
f : f
};
}
)();
然后调用函数:
o.newfunc.f();
还会呈现警告信息