Не можете прочитать свойство внутренней функции в 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
Другие вопросы по тегам