var n = 1;
var obj = {
fn : function(){
var n = 99;
console.log( n + this.n );
}
}
obj.fn()
obj.fn.call(obj);
obj.fn.call(this);
obj.fn.call(window);
obj.fn.call(null);
问这段代码的执行结果
一
obj.fn()
输出结果是 NaN
为什么是NaN呢?
1.js函数在解析变量时首先在自己的作用域内查找,如果当前作用域内有这个变量,就直接使用这个变量,因此 n = 99
2.obj.fn()
是js执行函数的4种模式之一,被称为对象调用模式,可以参考我之前写过的文章,对象调用函数时 this
执行这个函数,在这个对象内部没有n
,因此 n 是 undefined
, undefined+99
结果为NaN
二
obj.fn.call(obj)
this
指向obj
,同 obj.fn()
三
obj.fn.call(this);
结果是100
- n = 99
- 此时this指向window,在全局环境中声明的变量都可以认为是全局变量的属性,2.此时this指向window,在全局环境中声明的变量都可以认为是全局变量的属性,因此
this.n = 1
四
obj.fn.call(window);
同三
五
obj.fn.call(null);
同三
call
,apply
如果第一个参数为null,则this指向window(在node环境中则指向global)
总结: 如果这段代码在浏览器中执行就是上面的结果, 如果是在node中,this是 global