2015-08-12 5 views
1

Я экспериментирую с различными вызовами функций javascript, я попытался запустить код ниже. Вот ссылка скрипки https://jsfiddle.net/7de5vfpj/Javascript немедленный вызов функции

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

От скрипки он предупреждает как «власть» и «вау», когда я просто ожидал его, чтобы предупредить «вау». Почему так происходит?

+0

Почему вы ожидаете этого? Поведение правильное. Оба «предупреждения» запускаются сразу после выполнения функции. Поскольку это операция блокировки, второе предупреждение откроется, когда первый будет закрыт. – elclanrs

+0

Он показывает предупреждения, потому что, когда вы инициализируете свои свойства 'power' и' wow', вы инициализируете их с помощью 'call' to' alert' :) – AdityaParab

ответ

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 не является функцией, поскольку ошибка очень семантически заявляет.

+0

спасибо, это имеет смысл – lboyel

+0

@lboyel, без проблем! Рад, что это работает для вас. –

3

Оригинал Fiddle:

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.

Это также вызывает вызов в нижней части скрипки, чтобы исключить исключение выше.

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

Надеюсь, это поможет.

1

Я создал что-то, что могло бы сделать то, что вы хотели.

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

var app = new app; 

app.power() 
app.wow() 

вы можете использовать app.power() для вызова метода питания или app.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(); 
Смежные вопросы