在JavaScript中this 的值是在代码运行时计算出来的,它取决于代码上下文
函数内部的 “this” 是“点符号前面”的那个对象
如果 obj.f() 被调用了,则 this 在 f 函数调用期间是 obj
在没有对象的情况下调用:严格模式下this == undefined
在非严格模式的情况下,this 将会是 全局对象(浏览器中的 window)
箭头函数有些特别:它们没有 this。在箭头函数内部访问到的 this 都是从外部获取的
例1
var a = {name: "里面的name",sayName: function(){console.log("this.name = " + this.name);}};var name = "外面的name";function sayName(){var sss = a.sayName;sss(); // this.name = ?a.sayName(); // this.name = ?(a.sayName)(); // this.name = ?(b = a.sayName)(); // this.name = ?}sayName();
解析
sayName.call(null):  this -> window
sss.call(null): this ->  window,  this.name === “外面的name”
a.sayName.call(a): this ->  a,    this.name = “里面的name”
(a.sayName).call(a): this ->  a,    this.name = “里面的name”
(b = a.sayName)()  等价于b.call(null): this ->  window,  this.name === “外面的name”
例2
var length = 10function fn(){console.log(this.length)}var obj = {length: 5,method: function(fn) {fn();arguments[0]();}}obj.method(fn, 1) // 输出是什么?
解析
obj.method.call(obj, fn, 1)
arguments = [fn, 1]
fn.call(null): this -> window , this.length === 10
arguments0等价于arguments.fn.call(arguments), this.length === 2
