JS call():调用函数内的意外“this”上下文

时间:2013-09-25 14:21:01

标签: javascript window this call

这是我的实验脚本:

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 属性,而不是现在必须提取的window对象的name属性?

2 个答案:

答案 0 :(得分:1)

callSum中,this引用全局对象(winow),因此您实际上会覆盖window.name,这就是您fnCallSumm两次的原因。

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

答案 1 :(得分:1)

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

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