当前位置: 首页 > Web前端 > HTML

面试-js中的this

时间:2023-03-28 16:03:44 HTML

1.this指向调用它的普通函数中的对象。这与作用域相反。//声明位置varme={name:'xiuyan',hello:function(){console.log(`你好,我是${this.name}`)}}varyou={name:'xiaoming',hello:function(){vartargetFunc=me.hellotargetFunc()}}varname='BigBear'//调用位置you.hello()-结果:'BigBear'-原因:因为调用hello时它所在的对象是你,所以它内部的this会指向你,但是它内部调用targetFunc的时候并没有加上this,所以这个函数等同于window调用的,所以就是'BigBear'特例中的this点,而下面的类型会指向window立即执行函数setTimeout传入的函数和setInterval传入的函数如果this的指向改变箭头函数:this指向写的地方varname='BigBear'varme={name:'xiuyan',//声明位置hello:()=>{console.log(this.name)}}//调用位置me.hello()//BigBear构造函数,指向新构造的objectbind,call,apply重新定义了this的指向。其中bind不会运行函数,只是改变this,另外两个会执行函数并返回结果。apply的第二个参数是一个数组,其他两个和原函数的参数一样。2、实现bind、call、apply的特性:所有功能都可以继承;changethis实现调用:相当于给当前obj增加一个方法,这个方法的实现就是改变内部的this函数,执行完之后从this开始删除obj上的this方法Function.prototype.myCall=function(context,...args){if(context===null||context===undefined){context=typeofwindow==='undefined'?全局:window}letkey=Symbol('fn');context[key]=this;//thisisthefunctionwewanttorunconstres=context[key](args);deletecontext.func;returnres;}实现bind:bind生成一个函数,函数的调用分为两种:新的和直接的电话。Function.prototype.myBind=function(context,...args){if(typeofthis!=='function'){thownewTypeError('notafunction')}letself=this;functionresultFn(...args2){if(thisindtanceofresultFn){//如果是新的绑定函数returnnewself(...args,...args2)}returnself.call(context,...args,...args2)}resultFn.prototype=Object.create(self.prototype)returnresultFn}3.Executioncontext全局上下文:全局代码所在的环境,不在函数中的代码在全局执行上下文中创建时机:进入脚本时,只创建一个创建阶段:创建一个全局对象this,并指向this给全局对象为变量和函数安排内存空间给变量赋值undefined,将函数声明放到内存中创建作用域链执行阶段:执行代码函数上下文:in函数调用时创建的上下文创建时机:函数调用时的创建阶段:创建参数对象,this,将this指向调用它的对象,其他全局上下文代码执行完毕,函数上下文生命周期结束,出栈。评估执行上下文:不要在开发中使用