+ 设为首页 + 加入收藏

 
 
Feed除了timeline形式还有没
Chrome浏览器打开所有网页
node框架EggJS怎么入门学习
NvidiaTegraK1芯片为什么会有
阿里巴巴国际站适合从零
保研清北还是出国
     西安港汇实业有限公司

销售热线:张经理: 15191895022
     白经理: 18109296883
QQ:2355807252 2355807260
技术热线:15191895022
传真:029-86189022 4006388838转00685

 
当前位置:主页 > 产品展示 >
JS中的this在不同的地方指向不一样在哪些地方需要注意
发布者:知乎 发布时间:2019-12-07 01:26:46 阅读:821次 
摘要:轮子哥的回答一阵见血,但可能没那么直观,因此我来补充下他的回答吧。一般来说要阐述中的运作机制,有这样一句话诠释的非常贴切。简而言之,就是
轮子哥的回答一阵见血,但可能没那么直观,因此我来补充下他的回答吧。一般来说要阐述JavaScript中this的运作机制,有这样一句话诠释的非常贴切。Whenafunctionofanobjectwascalled,theobjectwillbepassedintotheexecutioncontextasthisvalue简而言之,就是function的this永远指向调用它的对象。而鉴于JS所谓的“万物皆对象”,这个this因此可以是任何物件,比如Global对象。并且出于某些特殊的原因,我们也可以在编码层显式的、主动的变更其指向,比如利用call/apply等方法。那么回答楼主问,之所以如下的第一段代码得不到你所期待的结果foo.prototype.bar=function(){setTimeout(this.sayHello,1000);}varexpr=function(){alert(this.myName);}foo.prototype.bar=function(){setTimeout(expr,1000);}//首先,这两段代码在你的case里基本是等同的。//楼下有人说setTimeout是干扰项,事实上,在这里,我认为//setTimeout(this.sayHello,1000)里的this.sayHello才是真正的干扰项。其次,当我们用setTimeout来向eventLoop注册函数时,函数是由引擎来发起调用的,因此这个调用者/caller会自动绑定为window,而同时一个函数在引擎内部的原型实际上大概是这样的形式(你写代码的时候可以脑补一下)。Function.invoke(caller,arguments)//这里的caller就是最终this会指向的对象,也就是轮子哥说的“this是被传进来的”。所以在发生sayHello调用时会变成sayHello.invoke(window,[])=>{alert([windowasthis].myName)}而此时,window.myName并没有被代码所声明过,因此return=>undefined。而当你明白Function.invoke(caller,arguments)这个实现原型后,你也就明白了为什么call和apply可以更改this指向,差不多就是如下的模型。Methodfn.apply(caller,arguments)=>returnfn.invoke(caller,arguments)如果看不懂....那么再教你一招,每次写JS代码发现this不受控制的时候,就把我上文引用的英文念一遍,其义自现(想想这个函数有没有owner,如果没有owner那this通常就是window,大部分情况下owner既caller)。
相关文章
友情链接:
Copyright © 2010-2013 www.gongyezidonghua.com All Rights Reserved. 版权所有 西安港汇实业
地址:西安市未央区大明宫万达广场2号甲写1408 电话:029-86189022 传真:4006358835-00685
陕ICP备13005737号 网站地图