2016-03-01 44 views
2

我試圖在IIFE中使用apply()。我收到一個錯誤'中間值不是函數',我在哪裏出錯?在IIFE中使用apply()

var Person = { 
    getFullName : function(firstName, lastName) { 
     return firstName + ' ' + lastName; 
    } 
} 

/* IIFE - using apply */ 

(function(firstName, lastName) { 
    getName = function(){ 
    console.log("From IIFE.."); 
    console.log(this.getFullName(firstName, lastName)); 
} 
    getName(); 
}).apply(Person, ['John', 'Doe']); 

Plnnkr:http://plnkr.co/edit/77db8Mu4i9RXGqt26PAP?p=preview

+0

申請是借另一功能。在IIFE中,你正在處理它的未定義的返回類型。 –

回答

7

問題是與;,在代碼中Person對象語法不終止,並且IIFE被視爲是延續。

閱讀:Automatic semicolon insertion

如果你看一下外部庫,其IIFE語句和;開始,用來從這種情況下逃脫。

還要注意的是,你的getName函數內部this不指Person對象,你需要或者使用閉包變量或傳遞值手動this

var Person = { 
 
    getFullName: function(firstName, lastName) { 
 
    return firstName + ' ' + lastName; 
 
    } 
 
} 
 

 
/* IIFE - using apply */ 
 

 
; 
 
(function(firstName, lastName) { 
 

 
    var self = this; 
 
    var getName = function() { 
 
    console.log("From IIFE.."); 
 
    console.log(self.getFullName(firstName, lastName)); 
 
    } 
 
    getName(); 
 
}).apply(Person, ['John', 'Doe']);

+2

或'getName();'應該是'getName.call(this);'。 –

+0

@DanD。這就是爲什麼我說'通過這個手動的價值' –

+0

花了他半分鐘的時間來弄清楚......) –