SOURCE

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)
console 命令行工具 X clear

                    
>
console