This是什么:
this是一个特别的关键字,是自动定义在全部函数和全局的做用域中。this是在运行时绑定的,而不是声明时绑定的。javascript
为何要有this
假设不存在this关键字,那么对于一个函数根据不一样上下文背景下的复用就用传入参数java
var obj = Object.create(null); obj.name = 'Nico'; function speak(context) { console.log(context.name + " speaks a word"); } speak(obj);
this指向的几种状况:
一、通常状况下,this是指向当前执行时的对象app
var person = { name: 'nico', getName: function() { console.log(this.name) } } var name = 'siip'; person.getName(); //nico
person对象调用getName方法,因此当前this指向的是person对象函数
二、若是没有明确对象时,this指向全局对象(在非严格模式下,在严格模式下,函数绑定undefined,也就是this指向undefined)this
var name = 'siip'; function className() { console.log(this.name); } className();//siip
其实这里的className可类似于window.className,因此当前this指向window
三、setTimeout、setInterval、匿名函数this指向全局对象prototype
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对象,这些函数里声明的函数,也指向调用者,相似于:code
function foo() { function bar() { console.log(this) } bar(); } foo();
四、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
有时候,ip
五、new Function 构造函数中的this指向该构造函数new出来的对象。作用域
由于new Function的过程大概:
因此new Function中的this指向return的对象。
this的指向取决于函数执行时的块级上下文