论断总结如下:
1.失常状况下,this的指向要看函数在何处调用;
2.失常状况下,this都指向调用该办法的对象、实例或者构造函数;
3.如果办法在调用时,没有调用对象(例:fn( )),默认的this指向是window,然而须要留神,在严格模式
下,却要指向undefined(但箭头函数和setTimeout是非凡状况);
4.箭头函数不会创立本人的this,它只会从本人的作用域链的上一层继承this,因而箭头函数
内的this要看该箭头函数的
下级作用域的调用对象;
5.setTimeout调用的代码运行在与所在函数齐全拆散的执行环境上,这会导致,这些代码中蕴含的 this关键字会指向window,即便是严格模式
下也不受影响,然而如果波及到箭头函数
,则遵循箭头函数的规定;
6.构造函数this指向其实满足第2条规定,至于把办法赋值给一个新的变量,执行后this指向了undefined,是因为class构造函数遵循严格模式
,也就是满足了第3条规定;
7.如果箭头函数
、setTimeout
、严格模式
同时存在,其规定权重如下:箭头函数 > setTimeout > 严格模式
状况一:在函数中,this指向window。
->>然而在use strict模式下,this指向undefined。
->>然而在use strict模式下,箭头函数this依然指向window
function app1() { console.log(this)}let app2 = function () { console.log(this)}let app3 = () => { console.log(this)}app1()app2()app3()//执行后果WidnowWidnowWidnow
'use strict'function app1() { console.log(this)}let app2 = function () { console.log(this)}let app3 = () => { console.log(this)}app1()app2()app3()//执行后果undefinedundefinedwindow
状况二:在对象中,一般函数this指向该对象,箭头函数指向window
->>解构后,this都指向window
->>然而在use strict模式下,this指向undefined
->>然而在use strict模式下,箭头函数this依然指向window
let Person = { say: function () { console.log(this) }, speak:() => { console.log(this) }}Person.say()Person.speak()//执行后果PersonWindow
let { say, speak } = Personsay()speak()//执行后果WindowWindow
'use strict'let Person = { say: function () { console.log(this) }, speak: () => { console.log(this) }}let { say, speak } = Personsay()speak()//执行后果undefinedWindow
状况三:在定时器中,this指向window,即便是'use strict'模式下也一样
let Person = { say: function () { setTimeout(function () { console.log(this) }) }}Person.say()//执行后果Window
状况五:定时器中应用箭头函数,this指向window,即便是'use strict'模式下也一样
let Person = { say: function () { setTimeout(() => { console.log(this) }) }}Person.say()//执行后果Person
状况六:在class类中
->>间接调用,this指向该实例;
->>但如果是构造函数内的静态方法,this指向该构造函数
->>将办法从新赋值后,无论何种办法,this指向undefined
class app { constructor(name) { this.name = name } say() { console.log(this) }}let person = new app('bob')person.say()let fn = person.say;fn()//执行后果personundefined
class app { constructor(name) { this.name = name } static say() { console.log(this) }}app.say()let fn = app.say;fn()//执行后果appundefined