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); } }; 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(); var bar = obj.foo; bar()
|
- 在浏览器中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){ fn.call({}); }
|
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();
|
当然还有很多很多例子,
涉及 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) }.bind(this)) } }
obj.foo();
var obj = { foo: function() { setTimeout(() => { console.log(this) }) } }
obj.foo();
var obj = { foo: () => { setTimeout(() => { console.log(this) }) } }
obj.foo();
|
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))
不一一列举了。