2017-02-23 118 views
0

我在鉻選項卡控制檯中運行的代碼塊,但我不能
明白爲什麼是第二個塊的輸出NaN.The值傳遞應該在第二種情況下不包括b,其中應該不重要的是我的想法。Javascript的箭頭功能

var adder = { 
    base: 1, 

    add: function(a) { 
    var f = v => v + this.base; 
    return f(a); 
    }, 

    addThruCall: function(a,n) { 
    var f = (v,n) => v + n + this.base; 
    var b = { 
     base: 2 
    };   
    return f.call(b,a,n); 
    } 
}; 
console.log(adder.addThruCall(3,4)); // output: 8 

但是當我做

var adder = { 
base: 1, 

add: function(a) { 
    var f = v => v + this.base; 
    return f(a); 
}, 

addThruCall: function(a,n) { 
    var f = (v,n) => v + n + this.base; 
    var b = { 
    base: 2 
    };   
    return f.call(a,n); 
} 
}; 
console.log(adder.addThruCall(3,4)); //output: NaN 
+0

fn.call的第一個參數()是「這'的論據。所以'f。call(a,n)'與調用'f(n,undefined)'相同,'f'中的'a'是'this'。因此,你從NaN號得到NaN + undefined = NaN – Shilly

回答

1

call作爲第一個參數接受在被調用的函數中將被用作this(稱爲context)的值。因此,在第二個示例中(f.call(a,n)a被認爲是上下文參數,而n被認爲是f函數第一個參數 - 因此,結果您的f函數實際上僅用單個參數調用,因此第二個參數爲undefined - 它相當於調用f(n)f函數需要兩個參數。作爲一個內部函數的結果,你將數字添加到undefined,它給你NaN

一件事澄清:

因爲this調用箭頭函數的第一個參數(上下文)call方法被忽略時,不沿箭頭功能綁定,它不會被用作箭頭函數內部this值但在你的第二個例子是不會引起你的probem的,即使你使用的仍然存在

+0

由於這不受箭頭函數的限制,因此該參數將被忽略。當我做console.log(adder.addThruCall(3,4,5))時,它也返回NaN。但它應該有一個4 + 5 +1即10 –

+0

不會。當你調用'f.call(a,n)'時,你實際上是這樣做的:'f(n)' - 'f'函數被調用了SINGLE參數第二個參數是「未定義」。調用方法的第一個參數不是作爲參數傳遞給被調用函數,而是作爲上下文傳遞。請檢查'調用'文檔以全面瞭解它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call –

0

()方法調用一個函數在給定單獨設置這個值和參數。

而不是使用調用,你可以直接返回f(a,n);

+0

我想了解call/apply的概念。 –

1

正常功能的問題在你的代碼的第二部分:

var adder = { 
base: 1, 

add: function(a) { 
    var f = v => v + this.base; 
    return f(a); 
}, 

addThruCall: function(a,n) { 
    var f = (v,n) => v + n + this.base; 
    var b = { 
    base: 2 
    };   
    return f.call(a,n); 
} 
}; 
console.log(adder.addThruCall(3,4)); 

如果你專注於console.log(adder.addThruCall(3,4)) 它:

return f.call(3, 4) // where 3 is the context specified and 4 is the argument 

這意味着你打電話,

f(4, undefined) // called with 4 

不僅如此,你正在返回:

v + n + this.base 

所以現在,

4 + undefined + 1 

這是NaN


以便更好地觀察使用本:

addThruCall: function(a,n) { 
var f = (v,n) => { 
    console.log(v, n, this.base) 
    return v + n + this.base; 
} 
var b = { 
    base: 2 
};   
return f.call(a,n); 
} 

解決方案:

addThruCall: function(a,n) { 
    var f = (v=0,n=0) => v + n + this.base; 

    var b = { 
     base: 2 
    };   
    return f.call(a,v,n); 
    } 
+0

在這種情況下如果我做console.log (adder.addThruCall(3,4,5));它應該返回給我一個結果,但它返回NaN。 –

+0

因爲'f'沒有收到'n'作爲參數。 'f.call(a,n)'是問題所在,它沒有爲'f'提​​供第二個參數。 'f.call'需要3個參數來做你想做的事情。 –

+0

我想我知道了如果我保留 var adder = { base:1, add:function(a){ var f = v => v + this.base; 返回f(a); }, addThruCall:function(x,y)var f =(v,n)=> v + n + this.base; var b = { base:2 }; 返回f.call(x,y,2); } }; console.log(adder.addThruCall(3,4,5)); // O/P 7 –