2017-02-02 45 views
0

下面的作品如预期使用IIFE作为参数的函数表达式?

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

dogName('Scruffy'); 

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

如果您注释掉dogName( '破旧');如果调整IIFE到

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

它输出该

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

它输出

My name is Fido! 
My name is undefined 

为什么函数式使用IIFE因为它的名字变了,为什么是IIFE在最后一个例子中的函数表达式之前先执行?

+1

如果您注释掉包含一个明确的分号的中间线,就成了'功能animalName(名称){...}(函数...)'...一个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