2013-09-25 74 views
0

這裏是我的實驗腳本:JS調用():意外的函數 「這個」 背景下被稱爲

window.name = 'myWindow'; 

function sum(num1, num2){ 
    console.log('context name: '+this.name+', caller: '+arguments.callee.caller.name); 
} 

function callSumNoName(num1, num2){ 
    sum.call(this, num1, num2); 
} 

function callSum(num1, num2){ 
    this.name = 'fnCallSumm'; 
    sum.call(this, num1, num2); 
} 

console.log(callSumNoName()); // no property name in the function 
console.log(callSum());  // the property name is 'fnCallSumm' 
console.log(callSumNoName()); // no property name in the function 

我預計this.name函數內總和()必須是:

myWindow 
fnCallSumm 
myWindow 

...但在現實中,他們分別是:

myWindow 
fnCallSumm 
fnCallSumm 

這是什麼意思?爲什麼在3個時間它表明從以前時間的函數調用的財產,而不是現在必須提取的窗口對象的name屬性?

回答

1

callSumthis指的是全局對象(winow),這樣你實際上覆蓋window.name這就是爲什麼你fnCallSumm兩次。

function callSum(num1, num2){ 
    this.name = 'fnCallSumm';// equivalent to `window.name = 'fnCallSumm';` 
    sum.call(this, num1, num2); 
} 
1

因爲您在前面的調用中設置了名稱值。 this.name現在是「fnCallSumm」

function callSumNoName(num1, num2){ 
    this.name = "myWindow"; 
    sum.call(this, num1, num2); 
}