Вы фактически вызываете оба предупреждения. Для того, чтобы получить ожидаемое поведение, вам нужно передать ссылки функции к методам, а не уже вызываются функции (ваш 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
не является функцией, поскольку ошибка очень семантически заявляет.
Почему вы ожидаете этого? Поведение правильное. Оба «предупреждения» запускаются сразу после выполнения функции. Поскольку это операция блокировки, второе предупреждение откроется, когда первый будет закрыт. – elclanrs
Он показывает предупреждения, потому что, когда вы инициализируете свои свойства 'power' и' wow', вы инициализируете их с помощью 'call' to' alert' :) – AdityaParab