2017-03-10 61 views
0

當我調用函數addToThis並傳入obj時,console.log(a)輸出的第一個數組索引值是1而不是obj爲什麼?傳遞的對象不被視爲javascript中函數的第一個參數

var obj = {num:2}; 

var addToThis = function(a,b){ 
    console.log(a); 
    return this.num + a + b; 
}; 

var arr = [1,2,3]; 
console.log(addToThis.apply(obj,arr)); 
+0

'apply'將數組內容作爲單獨的參數發送 - 所以'a'將被設置爲'1',並且'b'被設置爲'2'。你期望發生什麼? – Shadow

回答

0

參見:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

當使用apply(),所述第一參數是this參數,第二個參數是參數數組要被傳遞給函數。在你的情況下,a映射到1b映射到2。如果要添加第三個參數c,它將映射到3

更簡單地說,apply()中的第一個參數就是this將在您的函數中引用的參數。第二個參數是傳遞給函數的參數數組。

如果您要添加console.log(this),您會看到您的對象。

var obj = {num:2}; 
 

 
var addToThis = function(a,b){ 
 
    console.log(a); 
 
    console.log(this); 
 
    return this.num + a + b; 
 
}; 
 

 
var arr = [1,2,3]; 
 
console.log(addToThis.apply(obj,arr));

0

我會盡力從我個人理解解釋。使用apply的語法是:

fun.apply(thisArg, [argsArray]) 

此處,thisArg指出將應用於函數的上下文。 (例如,這個)。 [argsArray]是該函數的參數數組。

當你這樣做:

addToThis.apply(obj,arr) 

你基本上傳遞arr=[1,2,3]作爲參數傳遞給你的addToThis功能。因此,a變成1,b變成了2,如果你的函數定義中有一個c,那就是3 ..等等,直到達到你的數組長度。

請參閱this小提琴,這裏console.log(c)打印出數組中的第三個元素。但是,如果你寫這個代碼:

var obj = {num:2}; 

var addToThis = function(a,b,c,d){ 
    console.log(a); //prints first element in array 
    console.log(b); //prints second element 
    console.log(c); //prints third element 
    console.log(d); //prints undefined because there is no forth element 
}; 

var arr = [1,2,3]; 
addToThis.apply(obj,arr); 

希望這會有所幫助。

相關問題