普通函数中的 this:
this 总是代表它的直接调用者, 例如 obj.func , 那么 func 中的 this 就是 obj
2. 在默认情况 (非严格模式下, 未使用'use strict'), 没找到直接调用者, 则 this 指的是 window
3. 在严格模式下, 没有直接调用者的函数中的 this 是 undefined
4. 使用 call,apply,bind(ES5 新增) 绑定的, this 指的是 绑定的对象
箭头函数中的 this
默认指向在定义它时, 它所处的对象, 而不是执行时的对象, 定义它的时候, 可能环境是 window(即继承父级的 this);
下面通过一些例子来研究一下 this 的一些使用场景
示例 1
结果是:window
匿名函数, 定时器中的函数, 由于没有默认的宿主对象, 所以默认 this 指向 window
问题: 如果想要在 setTimeout 中使用这个对象的引用呢
用一个 变量提前把正确的 this 引用保存 起来, 我们通常使用 that = this, 或者 _this = this 来保存我们需要的 this 指针!
示例 2
window.val = 1;
var obj = {
val: 2,
dbl: function() {
this.val *= 2;
val *= 2;
console.log(val);
console.log(this.val);
}
};
// 说出下面的输出结果
obj.dbl();
var func = obj.dbl;
func();
结果是:2 4 8 8
<1> 12 行代码调用
val 变量在没有指定对象前缀, 默认从函数中找, 找不到则从 window 中找全局变量
即 val *=2 就是 window.val *= 2
this.val 默认指的是 obj.val ; 因为 dbl() 第一次被 obj 直接调用
<2>14 行代码调用
func() 没有任何前缀, 类似于全局函数, 即 window.func 调用, 所以
第二次调用的时候, this 指的是 window, val 指的是 window.val
第二次的结果受第一次的影响
示例 3. 在严格模式下的 this
结果是:undefined
示例 4. 箭头函数中的 this
此时的 this 是定义它的对象,即继承父级的 this, 父级中的 this 指的是 obj, 而非 window
示例 5
结果:都是 obj
f1 继承父级 this 指代的 obj,不管 f1 有多层箭头函数嵌套,都是 obj.
示例 6
结果:window,window
第一个 this:f1 调用时没有宿主对象,默认是 window
第二个 this: 继承父级的 this, 父级的 this 指代的是 window.
来源: http://www.jianshu.com/p/e902c754f1b3