Javascript立即函数调用

时间:2015-08-12 04:41:13

标签: javascript javascript-objects

我正在尝试不同的javascript函数调用,我尝试运行下面的代码。这是小提琴链接https://jsfiddle.net/7de5vfpj/

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

当我只是期待它提醒“哇”时,从小提琴中它会提醒“力量”和“哇”。为什么会这样发生?

4 个答案:

答案 0 :(得分:3)

原始小提琴:

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

app.power();

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

Uncaught TypeError: app.power is not a function

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

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

答案 1 :(得分:3)

您正在为变量分配警报,并在初始化时触发警报。

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;
}();

希望这有帮助。

答案 2 :(得分:2)

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

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

请参阅updated jsfiddle

您也可以利用Function.prototype.bind返回函数引用的事实:

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返回undefined,并且window.alert函数已被调用...因此,他们返回undefined,当您尝试调用app.power()时,你试图调用该方法的返回值 ......显然undefined不是函数,因为错误在语义上非常明确。

答案 3 :(得分:1)

我创造了一些可以做你想做的事。

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方法。要创建新方法,只需遵循使用

的格式
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();