Javascript 立即函数调用

Javascript immediate function invocation

我正在试验不同的 javascript 函数调用,我尝试了 运行 下面的代码。这里是 fiddle link https://jsfiddle.net/7de5vfpj/

var app = function () {
    var ans = {
        power: alert("power"),
        wow: alert("wow")
    }
    return ans;
}();

从 fiddle 它同时提醒 "power" 和 "wow",而我只是希望它提醒 "wow"。为什么会这样?

您实际上是在立即调用这两个警报。要获得预期的行为,您需要将函数引用传递给方法,而不是已经调用的函数(您的 IIFE 很好,问题的原因是您的方法声明):

var app = function () {
    var ans = {
        power: function() { alert("power") },
        wow: function() { alert("wow") }
    }
    return ans;
}();

参见updated jsfiddle

您也可以选择利用 Function.prototype.bind return 函数引用这一事实:

var app = function () {
    var ans = {
        power: alert.bind(this, 'power'),
        wow: alert.bind(this, 'wow')
    }
    return ans;
}();

app.power();

这里是that jsfiddle

在您的原始代码中,如果您打开控制台,您会看到 Uncaught TypeError: app.power is not a function。那是因为 window.alert returns undefinedwindow.alert 函数已经被调用...因此,它们 return undefined,当你尝试调用 app.power(),您正在尝试调用该方法的 return 值 ...显然 undefined 不是函数,正如错误在语义上所说的那样。

原文Fiddle:

var app = function () {
var ans = {
    power: alert("power"),
    wow: alert("wow")
    }
  return ans;
}();

app.power();

警报方法是由于对象文字语法而触发的。在 fiddle 底部调用 ans.power(); 导致抛出以下异常。

Uncaught TypeError: app.power is not a function

警报方法没有任何 return 值。这导致 powerwow 属性具有 undefined 值。

这也导致 fiddle 底部的调用抛出上面的异常。

您正在将警报分配给一个变量,并在初始化时触发警报。

var x = alert("aa"); //this will trigger alert on initialization.

可能更好的解决方案是同时使用 powerwow 函数。

var app = function () {
var ans = {
    power: function(){alert("power")},
    wow: function(){alert("wow")}
}
return ans;
}();

希望对您有所帮助。

我创造了一些东西,也许可以做你想做的事。

function app() {
    this.power = function(){
        alert('power');
    }
    this.wow = function(){
        alert('wow');
    }
};

var app = new app;

app.power()
app.wow()

您可以使用 app.power() 调用 power 方法,或 app.wow() 调用 wow 方法。要创建新方法,只需遵循 using

的格式
this.methodName = function(){
    //code you want to execute
}


//to call that method, outside of the function, 
//and after you set a variable to new app, call this

app.methodName();