javascript—在定义函数的同时调用函数的快捷方式
为了在定义函数的同时调用函数,我一直在使用:javascript—在定义函数的同时调用函数的快捷方式,javascript,function,Javascript,Function,为了在定义函数的同时调用函数,我一直在使用: var newfunc = function() { alert('hi'); }; newfunc(); 以下是将这2项结合起来的正确方法: var newfunc = function() { alert('hi'); }(); 否。第二个示例将立即调用匿名函数,并将其返回值指定给newfunc adamse描述了一种似乎有效的方法。我仍然会避免这种方法,因为两步流程更容易阅读,因此更容易维护 var newfunc = fu
var newfunc = function() {
alert('hi');
};
newfunc();
以下是将这2项结合起来的正确方法:
var newfunc = function() {
alert('hi');
}();
否。第二个示例将立即调用匿名函数,并将其返回值指定给
newfunc
adamse描述了一种似乎有效的方法。我仍然会避免这种方法,因为两步流程更容易阅读,因此更容易维护
var newfunc = function f() {
alert("hi!");
return f;
}();
使用命名函数表达式允许函数递归地调用自身,或者在本例中返回自身。但是,此函数始终会自动返回,这可能会令人烦恼。如果我正确理解您的问题,请尝试一下:
(f = function (msg) {
msg = msg ? msg : 'default value';
alert(msg); }
)();
f('I\'m not the default value!');
您将收到两个警报,第一个警报将显示“默认值”,第二个警报将显示“我不是默认值。您可以在上看到它的运行。单击“预览”使其运行。您可以这样做:
o = {};
o.newfunc = ( function() {
function f() {
alert('hi');
}
f();
return {
f : f
};
}
)();
(function($){
// 'this' now refers to the window.NS object
}).call(window.NS = window.NS || {}, jQuery);
然后调用如下函数:
o.newfunc.f();
还将显示一条警告消息您希望这样做的原因可能有很多。我不确定您的原因是什么,但让我介绍几个最喜欢的模式: 模式#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来设置自执行函数的上下文,而不是通常的括号,如下所示:
o = {};
o.newfunc = ( function() {
function f() {
alert('hi');
}
f();
return {
f : f
};
}
)();
(function($){
// 'this' now refers to the window.NS object
}).call(window.NS = window.NS || {}, jQuery);
或
问题是Internet Explorer的JScript引擎的行为与其他浏览器不同。在IE中,此代码在外部作用域newfunc和f中创建两个变量(和两个函数!)。在其他浏览器中(和ECMAScript规范),newfunc是在外部作用域中创建的,f仅在内部作用域中可用。此代码具有潜在危险,尤其是在全局作用域中使用时。进一步阅读此主题:@Andy:我知道IE在命名函数表达式中表现出奇怪的行为,但从您的链接来看,这似乎是一场噩梦。是的,即使我没有alize它创建了两个独立的函数,直到我找到了那个引用:-)我希望它在IE9中得到修复(它有一个完全重写的JavaScript引擎)。这正是我想要的。谢谢。我不认为这段代码实现了在一行中获得赋值和函数调用的目标。我知道“单例”“不是严格意义上的单身。。。它可以在代码中的其他时间“更新”。。。这只是我在创建要用作单例的对象时使用的编码样式。