This
This是什么:
this是一个迥殊的关键字,是自动定义在所有函数和全局的作用域中。this是在运行时绑定的,而不是声明时绑定的。
为何要有this
假定不存在this关键字,那末关于一个函数依据差别上下文背景下的复用就用传入参数
var obj = Object.create(null);
obj.name = 'Nico';
function speak(context) {
console.log(context.name + " speaks a word");
}
speak(obj);
this指向的几种状况:
1、平常状况下,this是指向当前执行时的对象
var person = {
name: 'nico',
getName: function() {
console.log(this.name)
}
}
var name = 'siip';
person.getName(); //nico
person对象挪用getName要领,所以当前this指向的是person对象
2、假如没有明白对象时,this指向全局对象(在非严厉形式下,在严厉形式下,函数绑定undefined,也就是this指向undefined)
var name = 'siip';
function className() {
console.log(this.name);
}
className();//siip
实在这里的className可类似于window.className,所以当前this指向window
3、setTimeout、setInterval、匿名函数this指向全局对象
var person = {
name: 'nico',
fns: function() {
setTimeout(function() {
console.log(this.name)
}, 100);//siip
setInterval(function() {
console.log(this.name)
}, 100);//siip
(function() {
console.log(this.name)
})()//siip
}
}
var name = 'siip';
person.fns();
这些要领都比较轻易明白this的指向,由于匿名函数或许定时器函数都是挂载window上的函数,挪用者是window对象,这些函数里声明的函数,也指向挪用者,类似于:
function foo() {
function bar() {
console.log(this)
}
bar();
}
foo();
4、apply、call可以转变this指向(无参数时或许传入null、undefined,指向window)
var person = {
name: 'nico',
applyFns: function() {
console.log(this.name)
}
}
var name = 'siip';
person.applyFns();//nico
person.applyFns.apply();//siip
有时候,
5、new Function 组织函数中的this指向该组织函数new出来的对象。
由于new Function的历程也许:
- 建立一个新的空对象
- 空对象_proto_指向Function.prototype
- 空对象与当前函数挪用的this绑定
- 返回新建立对象
所以new Function中的this指向return的对象。
小结
this的指向取决于函数执行时的块级上下文