Не можете прочитать свойство внутренней функции в IIFE?
var ag = (function(){
function update(at){
console.log('at::'+at);
}
return {hike:function(){update(2);}}
})();
В этом методе я могу получить доступ к внутренней функции hike() через ссылку (ag.hike();).
var ag = (function(){
function update(at){
console.log('at::'+at);
}
return update(2);
})();
В приведенном выше примере я не могу получить доступ к тому же внутреннему методу update () даже через ссылку (ag.update(2) или ag.update ()).
Я прочитал, что мы не можем прочитать внутреннее свойство IIFE. Но в первом случае я могу получить доступ, а во втором случае я не могу получить доступ.
В чем разница между двумя приведенными выше примерами? и почему эти два разных поведения? Пожалуйста, объясните мне. Извините за мой английский.
2 ответа
Использование bind
если вы хотите вернуть функцию для последующего вызова со значением at
привязан к 2;
return update.bind(null, 2);
Возвращает функцию, которую можно вызвать так
ag();// at::2
Проблема с вашим подходом заключается в том, что при выполнении return update(2);
ты звонишь update
функция сразу и возвращает значение, возвращаемое update
функция, которая undefined
так как вы ничего не возвращаете внутри этой функции.
В приведенном ниже фрагменте:
var ag = (function(){
function update(at){
console.log('at::'+at);
}
return { hike: function(){ update(2); } }
})();
Вы возвращаете объект, свойство которого hike
имеет ссылку на update
функционировать в нем. Вот hike
является функцией и, следовательно, вызывается.
Во втором фрагменте:
var ag = (function(){
function update(at){
console.log('at::'+at);
}
return update(2);
})();
Вы возвращаете результат update(2)
и так как update
функция ничего не возвращает, ag
имеет значение undefined
, который не вызывается.
Вы можете попытаться вернуть update
ссылка, а затем позвонить с 2
,
var ag = (function(){
function update(at){
console.log('at::'+at);
}
return update;
})();
ag(2) // at::2