这是我的实验脚本:
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属性?
答案 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);
}