的知识这是JavaScript中必须要讨论的知识点。这很重要但不容易理解。因为this在JavaScript中不同于其他语言。不同场景的this点是不同的(函数调用执行时,会生成一个变量对象来确定this的点,所以当前函数的this是函数调用执行时就确定的,所以点ofthis是灵活不确定的),而且,在严格模式和非严格模式下,this也会有不同的解释。为什么我们首先要想到如果JavaScript中没有this会怎样呢?例如,下面的代码:varyou={name:'Reader'}varme={name:'Stone'}identity(you);//READERspeak(me);//你好,我是Stone,我们通过identity和speak函数display进入context对象似乎是看不见的,但是一旦你的应用变得越来越复杂,这种display传递context会让代码越来越混乱,而且代码结构会越来越模糊。使用this可以避免这种情况,因为这提供了一种更优雅的隐式传递对象引用的方式,可以使API更简洁易用。this的绑定规则this全局对象的变量对象在全局对象中是一种特殊的存在。在全局对象中,this指向自身,例如://this绑定到全局对象this.a1=10;//通过声明绑定到变量对象,在全局环境中,变量对象本身就是vara2=20;//将隐式绑定到全局对象a3=30;控制台日志(a1);//10console.log(a2);//20console.log(a3);//30函数中的this在函数的执行上下文中,this由函数的调用者提供,this的指向由函数的调用方法决定。下面的例子:functionfn(){console.log(this)}fn();//Window{...}默认全局对象为调用者,相当于window.fn()(只讨论全局对象)。但在非严格模式下,this指向未定义,例如:'usestrict';functionfn(){console.log(this);}fn();//undefinedwindow.fn();//窗户{。..}这意味着如果不指定函数调用者,在严格模式下默认绑定全局对象,在非严格模式下默认指向undefined。很容易区分函数是独立调用还是被对象调用,例如:'usestrict';vara=20;functionfn(){vara=1;varobj={a:10,c:this.a+20}returnobj.c}console.log(window.fn());//40console.log(fn());//TypeError对象字面量的形式不会产生自己的作用域,所以obj中的this.a并不指向obj,而是和函数内部的this一样。因此,在调用window.fn()时,fn里面的this指向window对象,此时this.a访问的是全局对象中的a;由于是严格模式,当不指定调用者时,fn内部默认指向undefined,所以单独调用会报错。call/apply/bind显示绑定thisJavaScript提供了一种方式让我们在函数内部手动指定this指针,也就是上面说的隐式传递对象,它们是call/apply/bind。这三个方法是Function的原型方法,所有的函数都可以调用这三个方法。看这个例子:vara=20;varobj={a:40}functionfn(){console.log(this.a);}fn();//20fn.call(obj);//40fn。申请(对象);//40当函数调用apply/bind时,表示执行该函数,函数内部的this指向apply/bind的第一个参数。两者的区别:call的第一个参数是函数内部this的指针,后面的参数是函数执行所需要的参数。apply的第一个参数和call一样,都是执行函数的参数,然后以数组的形式传入bind方法也可以指定函数的this,只是和call/apply不同.bind方法会返回一个新的函数,这个函数和原函数有相同的函数体,但是函数内部的this作为bind方法的第一个参数进行绑定,后面的参数也是一个一个传入,而新功能不会自动执行。功能。构造函数中的this可以把构造函数看成一个普通的函数,这里的this指向创建的对象实例。之所以称为构造函数,是因为我们将使用new运算符来调用函数。使用new创建对象时,this的指向在第二步发生变化:创建一个对象实例,并在构造函数中将this指向这个对象执行构造函数中的代码,返回新创建的对象functionFoo(){this.a=20}varfoo=newFoo()console.log(foo.a)//20箭头函数中的this不会在箭头函数内部绑定this,它将在外部作用域中捕获this作为其本身的值.例如:functionPerson(){this.age=20;(()=>{this.age++})()}varp=newPerson()console.log(p.age)当DOM事件中的this被函数使用时,作为监听事件处理器时,其this指向触发事件的元素(对于addEventListener事件)。例如:
