2017-02-02 11 views
0

Нижеприведенные работает, как предполагалосьФункциональное выражение с использованием IIFE в качестве параметра?

var dogName = function animalName(name) { 
    console.log("My name is " + name); 
} 

dogName('Scruffy'); 

(function() { 
    console.log("My name is Fido!"); 
})(); 

Если закомментировать dogName ('неряшливо'); он выводит этот

My name is function() { 
    console.log("My name is Fido!"); 
} 

Если вы регулируете IIFE к

(function() { 
    console.log("My name is Fido!"); 
}()); //()) instead of)() 

Он выводит

My name is Fido! 
My name is undefined 

Почему функциональное выражение используют IIFE, как это имя переменной, и почему это IIFE выполняется в первом примере перед функциональным выражением?

+1

Если закомментировать промежуточную линию, которая содержит четкую точку с запятой, она становится 'функция animalName (имя) {...} (функция ...)' ... An IIFE. Положите ';' после определения 'animalName'. – deceze

+1

Связано: ['TypeError':' console.log ('...') 'не является функцией] (http://stackoverflow.com/q/31013221/4642212). – Xufox

ответ

4

Проблема в том, что вы не помещаете полуточку в конце выражения функции. Ваш код в основном интерпретируются как это:

var dogName = function animalName(name) { 
    console.log("My name is " + name); 
}(function() { 
    console.log("My name is Fido!"); 
})(); 

Насколько интерпретатор может сказать, вы передаете функции в качестве первого аргумента выражения именованной функции затем пытаются вызвать возвращаемое значение в качестве функции.

Чтобы исправить это, просто положите точку с запятой в конце выражения.

var dogName = function animalName(name) { 
 
    console.log("My name is " + name); 
 
}; // <-- 
 

 
(function() { 
 
    console.log("My name is Fido!"); 
 
})();

+1

Хорошее объяснение, спасибо! – Chad