javascript中的this

先来看个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var name = "Bob";
var nameObj ={
name : "Tom",
showName : function(){
alert(this.name);
},
waitShowName : function(){
setTimeout(this.showName, 1000); // bob
// setTimeout(function(){ //tom
// nameObj.showName()
// }, 1000);
}
};
nameObj.waitShowName();

一般而言,在Javascript中,this指向函数执行时的当前对象

The this keyword is relative to the execution context, not the declaration context.

  • 当没有明确的执行时的当前对象时,this指向全局对象window。
1
2
3
4
5
6
7
8
9
var obj = {
bar: "bar",
foo: function(){
console.log(this);
}
};
obj.foo(); //obj
var bar = obj.foo;
bar() //window
  • 在浏览器中setTimeout、setInterval和匿名函数执行时的当前对象通常是是全局对象window,当然也有例外
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


foo(function (){
console.log(this)
});



el.addEventListener('click', bar, false);




function foo(fn){ //this绑定为el
fn.call({});
}
  • eval函数 指向当前执行环境
1
2
3
4
5
6
7
8
9
10
var name = "window";

var Bob = {
name: "Bob",
showName: function(){
eval("alert(this.name)");
}
};

Bob.showName(); //Bob

当然还有很多很多例子,
涉及 new 还有es5中的 call,apply,bind, 以及es6中的() => {}

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

var obj = {
foo: function() {
setTimeout(function(){
console.log(this) //直接绑定this obj
}.bind(this))
}
}

obj.foo();


var obj = {
foo: function() {
setTimeout(() => {
console.log(this) //直接绑定this obj
})
}
}

obj.foo();

var obj = {
foo: () => {
setTimeout(() => {
console.log(this) //直接绑定this window
})
}
}

obj.foo(); //window

lambda表达式:

要计算x的平方加2

(λx.x*x)(λx.x+2)

假如用js来写

(function(x){ retrun x + 2; })((function(x){ return x*x })(N))

es6可以写成

(x => x + 2)((x => x * x)(N))

不一一列举了。

2016-04-18

⬆︎TOP