2016-07-21 89 views
1

當我執行下面的JavaScript片段...綁定使用null或未定義的一個JavaScript功能thisArg

function addAndThis(n1, n2) { 
    console.log("THIS:" + this + " SUM:" + (n1+n2)); 
} 

var boundNullThisAddAndThis = addAndThis.bind(null); 
var boundUndefinedThisddAndThis = addAndThis.bind(undefined); 
var boundStringThisAddAndThis = addAndThis.bind("TEST"); 

addAndThis(10, 20); 
boundNullThisAddAndThis(100, 200); 
boundUndefinedThisddAndThis(1000, 2000); 
boundStringThisAddAndThis(10000, 20000); 

...我得到這樣的輸出:

THIS:[object Window] SUM:30 
THIS:[object Window] SUM:300 
THIS:[object Window] SUM:3000 
THIS:TEST SUM:30000 

第一和最後一行的產量與我預期的一樣。但爲什麼Function.prototype.bind創建的綁定函數不會使用null或undefined調用包裝函數?我在網上沒有發現任何關於這種行爲的信息。

+1

當您添加 「用嚴格的」;在函數開始時,它的行爲和預期的一樣,所以默認情況下可以將null/undefined轉換爲窗口,除非嚴格模式在播放? – sielakos

+0

是的,如果綁定爲null或未定義,則表示全局上下文 – cstuncsik

回答

2

試圖將非對象用作上下文很可能存在一些問題。嘗試使用原語(fn.call(1))實際上會「框出」該值,將該原語轉換爲用作上下文的對象。

.call().apply().bind()函數都採取「nully」值,並使用默認的window對象。

正如其他人指出的(並且也在MDN頁面上),這不會在嚴格模式下發生。奇怪的是,儘管絕大多數時候嚴格模式都會給你戴上手套,但在這種情況下,它相信你知道你在做什麼! ,P

[MDN]

+0

正如其他人指出的(並且也在MDN頁面上),這不會在嚴格模式下發生。奇怪的是,儘管絕大多數時候嚴格模式都會給你戴上手套,但在這種情況下,它相信你知道你在做什麼! ,P – Whothehellisthat