普通函数中的this
- this总是代表它的直接调用者, 例如 obj.func ,那么func中的this就是obj
2.在默认情况(非严格模式下,未使用 ‘use strict’),没找到直接调用者,则this指的是 window
3.在严格模式下,没有直接调用者的函数中的this是 undefined
4.使用call,apply,bind绑定的,this指的是 绑定的对象,
bind绑定一次后不会改变,且bind 的执行的结果返回的是绑定了一个对象的新函数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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
911、
function test() {
console.log(this);//window
}
test();
2、
function test() {
;
console.log(this);//undefined
}
test();
3、
window.val = 1;
var obj = {
val: 2,
fn: function () {
this.val *= 2; //普通函数,this指向调用者
val *= 2;
console.log(this.val);
console.log(val);
}
};
obj.fn();// 4 2
var func = obj.fn;
func(); //8 8
//obj.fn()执行时,val 没有在fn的作用域里面定义,则去obj.fn()的作用域里面找,obj.fn()位于window,window.val是1;this指向obj,this.val是2
//func()执行时,window.val由于执行obj.fn(),现在是2;func()在window作用域下执行,this就是window,所以this.val和val都是window.val
4、
function f() {
var test = 'in the f!';
setTimeout(function(){ //是函数就会建立作用域
console('inner '+ test) // inner in the f!
}, 0);
}
//以上代码等于
function f() {
var test = 'in the f!';
function ff() {
alert('inner ' + test) //test在ff里面没定义,但在f里面进行了定义
} // 能访问到f中的test局部变量
setTimeout(ff, 0); // inner in the f!
}
f();
5、
var lzh = {
name: 'lzh',
say: function(something){
alert(something + this.name);
}
}
var iny = {
name: 'iny'
}
lzh.say.apply(iny, ['hi, I am ']); // 输出 hi I am iny
6、
var arr = []
for(var i=0; i<3; i++){
arr[i] = function(){ console.log(this) }
}
var fn = arr[0]
arr[0]
/*
解析: 因为函数是个特殊的对象,所以 arr 相当于 { '0': function(){}, '1': function(){}, '2': function(){}, length:3}
arr[0]相当于 `arr['0']` 相当于 `arr.0` (当然这种写法不符合规范),所以 arr[0]等价于 arr.0.call(arr), this就是 arr
*/
fn()
/*
解析: 相当于 `fn.call(undefined)`, 所以 fn 里面的 this 是 Window
*/
7、
var app = {
container: document.querySelector('body'),
bind: function(){
this.container.addEventListener('click', this.sayHello) //点击的时候会执行 sayHello,sayHello 里面的 this 代表 body 对象
this.container.addEventListener('click', this.sayHello.bind(this)) //点击的时候会执行 sayHello,sayHello 里面的 this 代表 app 对象
},
sayHello: function(){
console.log(this)
}
}
app.bind()
箭头函数中的this
默认指向在定义它时,它所绑定的对象的上一级,而不是执行时的对象, 定义它的时候,可能环境是window
1 | function foo() { |
setTimeout中的this
普通函数指向window
箭头函数指向定义的对象
引用函数,指向调用对象
1 | 0、 |
1 | //其他理解 |