AkiraZ's blog

愿键盘的余温传递到更遥远的将来

中文 / English
0%

this 指针指向

一般的指向

概括地说,就是指向调用它的那个对象。

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() // 1

// obj 环境执行
obj.f() // 2

其中,f() 是在全局执行,所以返回全局的 xobj.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() // undefined

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

// 情况一
(obj.foo = obj.foo)() // window
// 情况二
(false || obj.foo)() // window
// 情况三
(1, obj.foo)() // window

以上三种情况实质上是返回了函数方法的引用,后再在全局立即调用。

一些注意点

多层 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()
// Object
// Window

外层 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()
// undefined a1
// undefined a2

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) }) // window

var boss1 = {
name: 'boss1',
callback: callback,
callback2 () {
callback(() => { console.log(this) })
}
}

boss1.callback(() => { console.log(this) }) // still window
boss1.callback2(() => { console.log(this) }) // boss1

永远指向声明时的作用域

JavaScript this 的六道坎

https://blog.crimx.com/2016/05/12/understanding-this/

有新的心得以后再更新