那么这个是什么,new,bind,call,apply?这些你都用过吗?掌握好这些内容是基础的基础。不懂就赶紧复习复习,上网查资料等等!这点可以通过调用、应用和绑定来改变。这个点一般指向它的调用者,默认挂载在window对象下。在es6的箭头函数中,this指向创建者,而不是调用者。constfunc=function(){console.log(this);constfunc2=function(){console.log(this);};func2();//窗户};功能();//窗口'使用严格'constfunc=function(){console.log(this);constfunc2=function(){console.log(this);};func2();//不明确的};功能();//undefinedvara=2varobj={a:4,foo:()=>{console.log(this.a)functionfunc(){this.a=7console.log(this.a)}func.prototype.a=5returnfunc}}varbar=obj.foo()//在浏览器中输出:2bar()//在浏览器中输出:7newbar()//在浏览器中输出:7用这个指向一般函数方法中的全局对象:functiontest(){ this.x=1 console.log(this.x)}test()//1作为构造函数被调用,this指向对象new实例化:functiontest(){ this.x=1}varo=newtest()alert(o.x)//1首先,学习this需要掌握什么?this最重要的是它指向的类型,那么在JavaScript中如何判断this的指向呢?this是在调用函数时确定的,它的指向完全取决于调用函数的位置,而不是声明位置。(箭头函数除外)记住一件事:this总是指向调用它的对象,对象中方法中的this指向调用它的对象。varobj={a:1,b:{a:2,func:function(){console.log(this.a);//输出为2console.log(this);//输出是b对象}}}//调用obj.b.func();varobj={a:1,b:{func:function(){console.log(this.a);//取消定义console.log(this);//b对象}}}//调用obj.b.fun();改变调用方式而不是直接调用:varobj={a:1,b:{a:2,func:function(){console.log(this.a);//undefined如果a定义在对象obj之外,则输出为定义在外部的值console.log(this);//窗口}}}varj=obj.b.func;//把对象b下的方法赋值给j,不调用j();//调用,绑定的对象是window,不是b对象直接调用大多数情况下,函数的调用方式决定了this的值,this在执行过程中不能赋值,每次this的值可能不同调用函数的时间。this指向的对象称为函数的context对象context,this的指向取决于函数的调用方式。functionfoo(){console.log(this);}所以让我问你?这个指向哪里?哈哈哈,我大概不知道,因为谁调用就是指谁,函数不调用,真不知道指向什么。functionfoo(){console.log(this);}//窗口全局对象>undefined//obj对象varobj={foo:foo}obj.foo();>{foo:f}直接调用函数名function,this指向全局变量window,通过对象和函数名调用函数,this指向对象。当函数被调用时,会创建一个执行上下文,其中包含函数在何处被调用、函数如何被调用、传入的参数等信息。this的使用场景:被new作为构造函数调用,用作对象的方法,直接作为函数调用,在箭头函数中通过call、apply、bind、this调用。基础知识:函数内部this指向问题:varmyObj={foo:"bar",func:function(){varself=this;控制台日志(this.foo);控制台日志(self.foo);(function(){console.log(this.foo);console.log(self.foo);}());}}myObj.func();结果:在对象方法中调用时barbarundefinedbar:varlocation={x:0,y:0,move:function(x,y){this.x=this.x+x;这个.y=这个.y+y;控制台日志(this.x);//1console.log(this.y);//1}};location.move(1,1)//this绑定到当前对象,即location对象作为函数调用时:functionfunc(x){this.x=x;}func(2);//函数调用时,this绑定到全局对象window,相当于直接声明了一个全局变量xconsole.log(x);//x变成了一个全局隐式变量,值为5this在对象中的指向问题:vara=1;functionprintA(){console.log(this.a);}varobj={a:2,foo:printA,bar:function(){打印A();}}obj.foo();//2obj.bar();//1varfoo=obj.foo;foo();//1this在函数声明时不绑定,而是在函数运行时动态绑定固定。前端笔试:functiona(xx){this.x=xx;归还这个;}varx=a(5);变量y=a(6);控制台日志(x.x);//undefinedconsole.log(y.x);//6基础知识:新绑定、显式绑定、隐式绑定、默认绑定、this绑定的优先级、箭头函数中的this。箭头函数中的this是根据声明的地方来确定的。是ES6中出现的一个知识点。箭头函数中的this不能通过call、apply、bind进行修改,而且由于箭头函数没有constructor构造函数,所以不能用new调用,所以不能作为构造函数使用,否则会出错。箭头函数不能为参数、super、this或new.target定义局部绑定。箭头函数中对arguments、super、this或new.target的任何引用都解析为当前词法作为作用域中的绑定,通常,this是箭头函数所在的函数作用域。不同场景下this的指向://匿名函数中的this指向全局对象vara=2;varfunc={a:4,fn:(function(){console.log(this);//windowconsole.log(this.a);//2})()}//setInterval和setTimeout定时器中的this指向全局对象vara=2;varoTimer=setInterval(function(){vara=3;console.log(this.a);//2clearInterval(oTimer);},100);//eval中的this指向调用上下文中的this(function(){eval("console.log(this)");//窗口})();functionFoo(){this.bar=function(){eval("console.log(this)");//Foo}}varfoo=newFoo();foo.bar();//apply和call中的this指向参数中的对象vara=2;varfoo={a:20,fu:function(){console.log(this.a);}};varbar={a:200}foo.fu.apply();//2(参数为空,默认指向全局对象)foo.fu.apply(foo);//20foo.fu.apply(bar);//200thisboundPriority:优先级:newbinding>displaybinding>implicitbinding>defaultbindingnewbinding:函数中有new调用,this绑定到新创建的对象displaybinding:函数中有bind,apply,callcall,this绑定到指定对象隐式绑定:函数是否在上下文对象中调用,this绑定到那个上下文对象默认绑定:在严格模式下,绑定到undefined,否则绑定到全局对象new绑定:当用new调用函数时,this绑定到新创建的构造函数实例func(){console.log(this)}varbar=newfunc()//func实例,this是bar的重点,新建一个对象,构造函数的原型赋值给新对象的__proto__,把新对象赋给当前this,执行构造函数,如果函数没有返回其他对象,那么new表达式中的函数会自动返回这个新对象显示绑定:call,apply,bind可以用来修饰函数绑定的thisfunctionfn(name,price){this.name=namethis.price=price}functionFood(category,name,price){fn.call(this,name,price)//调用方法调用//fn.apply(this,[name,price])//应用方法调用this.category=category}newFood('fruit','apple','6');call和apply的区别:call方法接受参数列表,apply方法接受参数数组fu.call(this,arg1,arg2,...)//callfu.apply(this,[arg1,arg2,...])//applyfunc.bind(thisArg[,arg1[,arg2[,...]]])//bindusage隐式绑定:函数是否在上下文对象中调用,如果是,则this绑定该上下文对象。vara='hello5'varobj={a:'world',foo:function(){console.log(this.a)}}obj.foo()//在浏览器中输出:"world"vara='hello555'varobj={a:'world555',b:{a:'Ch',foo:function(){console.log(this.a)}}}obj.b.foo()//浏览器中输出:"Ch"默认绑定:vara='hello'functionfoo(){vara='world'console.log(this.a)console.log(this)}foo()//相当于执行window.foo()//在浏览器中输出:“hello”//在浏览器中输出:Windowobjectvara='hello'varobj={a:'world55',foo:function(){console.log(this.a)}}varbar=obj.foobar()//在浏览器中输出:“hello”vara='hello'varobj={a:'world55',foo:function(){console.log(this.a)}}functionfunc(fn){fn()}func(obj.foo)//在浏览器中输出:"hello"当前文章内容涉及前端和PHP知识点。有兴趣的可以关注一下,很荣幸被你发现,真是有见地!感谢您的关注。在以后的日子里,希望大家一直默默支持我,我会努力写出更多优秀的作品。我们一起成长,从零开始学习编程,将Web前端领域、数据结构与算法、网络原理,通俗易懂的呈现给小伙伴们。分享Web前端相关的技术文章、工具资源、精选课程、热点资讯。意见反馈:如果本账号内容有问题(例如:涉及版权或其他问题),请及时联系我们进行整改,我们会尽快处理。感谢阅读,原创不易,喜欢请点个赞,这是我写作最大的动力。欢迎来到达达简书!这是一个有品质有态度的博客
