一般的指向
概括地说,就是指向调用它的那个对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var f = function () { console.log(this.x); }
var x = 1; var obj = { f: f, x: 2, };
f()
obj.f()
|
其中,f()
是在全局执行,所以返回全局的 x
;obj.f()
在 obj
内部执行,所以返回 obj.x
1 2 3 4 5 6 7 8 9 10
| var a = { p: 'Hello', b: { m: function() { console.log(this.p); } } };
a.b.m()
|
m()
由 b
调用,所以返回 b.p undefined
但是有些调用是在全局上的
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var obj ={ foo: function () { console.log(this); } };
obj.foo()
(obj.foo = obj.foo)()
(false || obj.foo)()
(1, obj.foo)()
|
以上三种情况实质上是返回了函数方法的引用,后再在全局立即调用。
一些注意点
多层 this
1 2 3 4 5 6 7 8 9 10 11 12
| var o = { f1: function () { console.log(this); var f2 = function () { console.log(this); }(); } }neiceng
o.f1()
|
外层 this
指向的是 o
,内层的函数实际上是传了一个地址给 f2
,最后是调用的这个地址,相当于在全局
等价于
1 2 3 4 5 6 7 8 9 10
| var temp = function () { console.log(this); };
var o = { f1: function () { console.log(this); var f2 = temp(); } }
|
数组处理方法中的 this
1 2 3 4 5 6 7 8 9 10 11 12 13
| var o = { v: 'hello', p: [ 'a1', 'a2' ], f: function f() { this.p.forEach(function (item) { console.log(this.v + ' ' + item); }); } }
o.f()
|
forEach
调用时,this
指向顶层
箭头函数
箭头函数说是谁就是谁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function callback (cb) { cb() }
callback(() => { console.log(this) })
var boss1 = { name: 'boss1', callback: callback, callback2 () { callback(() => { console.log(this) }) } }
boss1.callback(() => { console.log(this) }) boss1.callback2(() => { console.log(this) })
|
永远指向声明时的作用域
JavaScript this 的六道坎
https://blog.crimx.com/2016/05/12/understanding-this/
有新的心得以后再更新