1

这是我的实验脚本:

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

我希望函数sum()中的this.name必须是:

myWindow
fnCallSumm
myWindow

...但实际上它们是:

myWindow
fnCallSumm
fnCallSumm

这是什么意思?!为什么第 3 次显示的是上次函数调用者的name属性,而不是现在必须提取的窗口对象的 name 属性?

4

2 回答 2

2

在指callSumthis是全局对象(winow),所以你实际上是在覆盖window.name这就是你得到fnCallSumm两次的原因。

function callSum(num1, num2){
    this.name = 'fnCallSumm';// equivalent to `window.name = 'fnCallSumm';`
    sum.call(this, num1, num2);
}
于 2013-09-25T14:24:58.210 回答
1

因为您在之前的调用中设置了名称值。this.name 现在是“fnCallSumm”

function callSumNoName(num1, num2){
    this.name = "myWindow";
    sum.call(this, num1, num2);
}
于 2013-09-25T14:26:05.170 回答