城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

js中this指向的问题与联系深入探究

3月19日 遭人厌投稿
  1。0前言
  JavaScript中最大的一个安全问题,也是最令人困惑的一个问题,就是在某些情况下this的值是如何确定的。有js基础的同学面对这个问题基本可以想到:this的指向和函数调用的方式相关。这当然是正确的,然而,这几种方式有什么联系吗?这是我接下来要说明的问题。
  2。0this从哪里来
  this是js的一个关键字,和arguments类似,它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。这句话似乎与认知不同,我们在函数体外部即全局作用域下也能使用this。直接在全局作用域下输出thisconsole。log(this);输出window
  但是不要忘记,即便是全局作用域,依旧是运行在window下的,我们写的代码都在window的某个函数中。而这也催生了一种理解this指向的方法:this永远指向调用者(非箭头函数中)。
  3。0作为普通函数调用
  函数作为普通函数直接调用(也称为自执行函数)的时候,无论函数在全局还是在另一个函数中,this都是指向window。functionfn(){this。authorW}fn();console。log(author);Wango
  这很好理解,但又不是很好理解,因为在代码中省略了window,补全后就好理解了:this指向的是调用者。
  functionfn(){this。authorW}window。fn();console。log(window。author);Wango
  而在内部函数中,自执行函数中的this依旧指向全局作用域,我们无法通过window。foo()调用函数,但并不妨碍我们先这样理解(具体参见本文最后一部分this的强制转型)。
  functionfn(){functionfoo(){console。log(this);}foo();Windowwindow。foo();TypeError}fn();
  4。0作为构造函数调用
  在构造函数中,this指向new生成的新对象,即构造函数是通过new调用的,构造函数内部的this当然就应该指向new出来的对象。
  functionPerson(name,age){this。this。console。log(this);Person{name:Wango,age:24}}newPerson(Wango,24);构造函数中的this与构造函数的返回值类型无关,下列代码中p指向了构造函数返回的对象,而不是new出来的对象。当然,这是构造函数的特性,与本主题关系不大。
  functionPerson(name,age){console。log(this);Person{}this。this。console。log(this);Person{name:Wango,age:24}return{name:Lily,age:25}}Person。prototype。sayNamefunction(){returnthis。namethis。age}constpnewPerson(Wango,24);console。log(p。sayName());TypeError:p。sayNameisnotafunction5。0作为对象方法调用
  通过对象方法调用时,this指向应该是最明晰的了。与其他面向对象语言的this行为相同,指向该方法的调用者。
  functionPerson(name,age){this。this。}Person。prototype。sayNfunctionfn(){returnthis。namethis。age}constpnewPerson(Wango,24);console。log(p);Person{name:Wango,age:24}console。log(p。sayName());Wango24
  5。1通过【】调用对象方法
  通常,我们对于对象方法是通过。语法调用,但通过〔〕也可以调用对象方法,在这种情况下的this指向常常会被我们混淆、忽略。
  functionfn(){console。log(this);}constarr〔fn,1〕;arr〔0〕();〔Function:fn,1〕functionfn2(){arguments〔0〕();}fn2(fn,1);〔Arguments〕{0:〔Function:fn〕,1:1}
  在上例中,无论是数组还是伪数组,其本质上都是对象,在通过〔〕获取函数元素并调用的时候,会改变函数中的this指向,this指向这个数组或伪数组,与对象调用函数的行为一致。
  6。0通过call、apply调用functionfn(){console。log(this。name);}constauthor{name:Wango}fn。call(author);Wango
  这似乎与this永远指向调用者相违背,但一旦我们明白了call函数的实现机制就会明白,这不仅不是违背,反而是佐证。对call、apply、bind下面截取call简要说明。
  保存一个全局变量作为默认值Function。prototype。myCallfunction(context,。。。args){if(typeofcontextobject){如果参数是null,使用全局变量}else{参数不是对象的创建一个空对象contextObject。create(null);}使用Symbol创建唯一值作为函数名letfnSymbol();context〔fn〕context〔fn〕(。。。args);deletecontext〔fn〕;}
  call函数最核心的实现在于context〔fn〕和context〔fn〕(。。。args);这两行。实际上就是将没有函数调用者的普通函数挂载到指定的对象上,这时this指向与对象调用方法的一致。而deletecontext〔fn〕;是在调用后立即解除对象与函数之间的关联。
  7。0严格模式下的不同表现
  7。1this强制转型
  使用函数的apply()或call()方法时,在非严格模式下null或undefined值会被强制转型为全局对象。在严格模式下,则始终以指定值作为函数this的值,无论指定的是什么值。这也是为何在严格模式下,自执行函数的this不再指向window,而是指向undefined的根本原因。
  定义一个全局变量functiondisplayColor(){console。log(this。color);}在非严格模式下使用call修改this指向,并指定null,或undefined,displayColor。call(null);displayColor。call();red
  修改指向无效,传入null或undefined被转换为了window
  实际上,我们也可以将自执行函数,如fn(),看作是fn。call()的语法糖,在普通模式下,第一个参数默认为undefined,但被强制转换为window。这也就解释了为何所有自执行函数中this都指向window但无法通过window调用的问题(函数在call函数中挂载到window对象上,执行后被立即删除,所以无法再次通过window访问)。
  apply()或call()方法在严格模式下传入简单数据类型作为第一个参数时,该简单数据类型会被转换为相应的包装类,而非严格模式不会如此转换。functionfoo(){console。log(this);}foo。call();Window{}foo。call(2);Number{2}functionfoo(){console。log(this);}foo。call();undefinedfoo。call(2);2
  8。0箭头函数的this指向
  在箭头函数中,this引用的是定义箭头函数的上下文。即箭头函数中的this不会随着函数调用方式的改变而改变。
  functionPerson(name){this。this。getName()console。log(this。name);}constpnewPerson(Wango);p。getName();WangoconstgetNamep。getNgetName();WangogetName。call({name:Lily});Wango
投诉 评论 转载

iPhone13来了!苹果官宣果粉之家,专业苹果手机技术研究十年!您身边的苹果专家早上小编才跟大家说苹果这两天就会发布秋季新品发布会邀请函。就在刚刚,苹果已经正式官宣了今年秋季发布会的具体时间:将于太……智能电视盒子与机顶盒区别,对比看看哪个更适合你现如今,很多家庭都使用上了电视盒子。但其实很多人对电视盒子有什么用都不太清楚,那究竟电视盒子有什么功能呢?电视盒子与机顶盒有什么区别呢?智能电视盒子与机顶盒区别,对比看看……小米11Ultra跌破5000元,网友还买什么小米12Pro作为小米旗舰机代表,小米11Ultra从一发布便受到了米粉和网友的青睐。奈何,由于小米11Ultra高昂的价格,让很多米粉和网友止步。甚至还有很多米粉和网友采取观望的态度。刚刚……首家荣获医疗FDA认证,手表血压算法商寻求战略合作全球智能手表市场发展将再迎来全新的市场风口,市场出货量突破十亿对大关将指日可待,智能手表也将由此迈向生态圈融合和内容融合的3。0时代。旭日大数据于9月4日在南山深铁皇冠假……华为Mate系列新机获得进网许可支持5G,搭载鸿蒙HarmoIT之家12月7日消息,华为终端有限公司于12月6日获得工信部进网许可,该设备型号为NOHAN50,属于Mate系列。更准确地说,型号类似当前的Mate40Pro。从许可……入手OPPOFindX3体验比vivonex更好用,目前最接外观非常精致,比我的vivonex轻薄不少,也更窄一些,握持感要好不少,而且白色版本的摸起来很细腻,手感非常舒服!屏幕显示效果绝对是目前最顶级的,原生10bit真的太赞了……不差钱就发顺丰,暴力分拣的申通股价已暴跌70暴力分拣乱象迟迟得不到有效改变,一个非常重要的原因还是在于违规成本低到不足以让快递企业产生足够的改进动力。文竹里周末,一则关于申通建议客户发顺丰的热搜刷屏了。……华为悄悄上线二手机麒麟990加持,并支持5G近期华为发布了P50系列,只不过该系列并不支持5G。然而最近华为官方却悄悄上线了几款新品,而且还都支持5G。或许这时就有许多朋友想不明白了,华为P50系列都不支持5G,但……华米科技GTR3PRO,支持血压测量,是目前智能手表最该有的以前的智能手表,在许多人看来,不过是玩具罢了,只能作为计步器和脉搏检测器的结合来使用,一方面是因为以前的智能穿戴设备测量精度有限,另一方面则是因为大部分智能穿戴设备所支持的测量……壹现场丨乐视网10年财务造假被多名投资者诉至法院乐视网信息技术(北京)股份有限公司(以下简称乐视网)因十年财务造假等违法事实,受到中国证监会行政处罚,部分投资者将乐视网、贾跃亭等人起诉到北京金融法院。5月12日,北青北京头条……js中this指向的问题与联系深入探究1。0前言JavaScript中最大的一个安全问题,也是最令人困惑的一个问题,就是在某些情况下this的值是如何确定的。有js基础的同学面对这个问题基本可以想到:this……中金数据与华为数字能源面向金融领域开展深度合作来源:经济日报新闻客户端5月9日,中金数据集团有限公司(以下简称中金数据)与华为数字能源技术有限公司(以下简称华为数字能源)在京举行战略合作签约仪式,结成全面合作伙伴关系。……
是商流带动物流发展,还是物流支撑商流变革?小屏市场重燃战火,小米12mini曝光,或全面阻击iPhon没有马云的时代与只有时代的马云说法欠妥人工智能岗位毕业生月工资23960元位居高薪职位榜首海奥华预言,一千年后地球还在吗?三大无价之宝,其中一个用大约11公斤纯黄金制作,稀有无比iPhone13ProMax后置摄像头迎来史无前例的升级,可科学家人类正处于第六次生物大灭绝之中今年的618,你觉得商品的价格真的降了么?华为Mate环绕屏卷轴屏渲染图曝光屏幕最大可扩展70南都曝光软件商店应用涉黄诱导消费,OPPO感谢监督比亚迪汉EV,颠覆了我对国产新能源的认知
家长邀请函蒜薹有哪些做法?蒜薹的功效金色的童年高仿复刻手表推荐,BBR厂罗杰杜彼王者系列黑武士值得入手吗? 第一次买房首付多少钱买房凑不齐首付款怎么办哑然失笑造句用哑然失笑造句大全45度倒立健身能有效的改善老人失眠上汽R品牌更名飞凡汽车小学英语教育专业实习报告古人活的轻松自在英俄“大博弈”的历史思考贺新郎老去相如倦

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁