this指向
如何判断this 指向 就需要找到这个函数的直接调用位置 找位置之后再确定this指向
- 默认情况下 严格模式绑定到undefined,非严格模式 绑定全局上window
- new 调用 直接指向new 创建的新对象
- call ,apply,bind 指向指定的 绑定对象,若果第一个参数传入的为null和undefined,指向全局对象
- es6的箭头函数没有自己的this, 他的this指向取决于函数定义时所在的上下文
- 事件绑定函数中的this指向当前操作的元素
- 作为obj对象时,this指向obj
- 作为function时,this指向function对象
参考文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this
demo
单独函数
function foo(){
//'use strict'
this.name = 'foo';
console.log(this);
}
//1-a:直接调用
foo()//this->window 严格模式下:this->undefined 此处报错
//1-b:构造函数调用
var f = new foo();//this ->f对象
//1-c: call,apply
var obj = {name:'obj',xxx:'this is a test!'}
var f1 = foo.call(obj);//this->obj
var f2 = foo.apply(obj);//this->obj
//1-d bind
var bindObj = {name:'bindObj'}
var f3 = foo.bind(bindObj);
f3();//this->bindObj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
对象方法中的this
var person = {
name:'zhangsan',
sayName:function(){
console.log(this);
return this.name;
}
}
//2-a:通过 对象.方法的形式调用 this 指向调用的对象
person.sayName();// this->person
//2-b:外层变量对对象下方法的引用
var s = person.sayName;
//这时候 s 就回到我们之前说的情况1:单独函数 一样了
//无论函数是以对象方法存在还是 单独函数形式存在 我们拿到该函数的指针变量s 无论在哪里单独调用s()
//此时函数内部的 this 严格模式指向 undefined 非严格模式指向 window
//比如:
//
function bar(){
s();//s函数内部this->window(严格模式 undefined)
}
domObj.addEventListener('click',function(){
console.log(this);
s();//s函数内部this->window(严格模式 undefined)
});
//这里 对dom元素设置监听事件 回调函数内部的this 指向 该dom对象
//下面的例子 更直观 跟2:对象方法中的this 调用 对象.方法名 类似
domObj.onclick = function(){
console.log(this);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
箭头函数
箭头函数内部不存在自己的this ,这个this 只是定义该函数是所在的对象,而不是使用时所指的对象
var arrow = ()=>{console.log(this)}
arrow();//this->window
var person = {
name:'zhangsan',
sayName:function(){
console.log(this);
arrow();//arrow函数内部this->window
var a1 = ()=>{console.log(this)}
a1();//a1中this 指向 person(定义时所在的对象)
return this.name;
}
}
person.sayName();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15