我正在尝试不同的javascript函数调用,我尝试运行下面的代码。这是小提琴链接https://jsfiddle.net/7de5vfpj/
var app = function () {
var ans = {
power: alert("power"),
wow: alert("wow")
}
return ans;
}();
当我只是期待它提醒“哇”时,从小提琴中它会提醒“力量”和“哇”。为什么会这样发生?
答案 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
警报方法没有任何返回值。这导致power
和wow
属性具有undefined
值。
这也导致小提琴底部的调用抛出上面的异常。
答案 1 :(得分:3)
您正在为变量分配警报,并在初始化时触发警报。
var x = alert("aa"); //this will trigger alert on initialization.
可能更好的解决方案是同时发挥power
和wow
功能。
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();
在原始代码中,如果您打开控制台,则会看到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();