Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript—在定义函数的同时调用函数的快捷方式_Javascript_Function - Fatal编程技术网

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引擎)。这正是我想要的。谢谢。我不认为这段代码实现了在一行中获得赋值和函数调用的目标。我知道“单例”“不是严格意义上的单身。。。它可以在代码中的其他时间“更新”。。。这只是我在创建要用作单例的对象时使用的编码样式。