JavaScript变量提升的相关讨论_第1页
JavaScript变量提升的相关讨论_第2页
JavaScript变量提升的相关讨论_第3页
JavaScript变量提升的相关讨论_第4页
JavaScript变量提升的相关讨论_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2017年的事情还是2017年完成吧。话不多说,现在开始:之前翻译过两篇发表在Medium上的两篇文章,关于变量和函数提升的问题。后来发现,一个读者(GavinOrland)与作者(BhuvanMalik)就函数和变量提升的问题产生了分歧,是留言形式的。最后作者还专门又写了一篇文章来回应问题,我想也是想让大家都看见吧。所以我自己整理一下,现将他们的讨论也做一个搬运吧。GavinOrland与BhuvanMalik就提升话题中“问题1”和“问题3”的讨论GavinOrland:Explanations1and3areslightlyincorrectasfunctiondeclarationsareactuallyhoistedabovevariabledeclarations.解释1和3有点不正确,实际上函数声明实际上是在变量声明之上提升的。BhuvanMalik:Forthefirstquestion'sbehindthescenes,Ihavepurposelyshowntheeffectsofhoistingonlyinsidethefunctionalscopeofb().对于第一个问题,我刻意仅在b()的功能范围内展示了提升的效果。Asforthethirdquestion,varhoisted='Tmavariable";comesfirstandthereforethevariable"hoisted"shouldbehoistedfirstwithan"undefined"value.Icouldbewronginwhichcaseyoucanpointmetoasourcewhichprovesmewrong,inwhichcaseI'dbehappymakethechange.?第三个问题:varhoisted=Tmavariable”’;因此首先应该提升“提升”的变量,并且具有"undefined〃的值。我可能是错的,在这种情况下,你可以指出我的来源,证明我错了,在这种情况下,我会很高兴做出改变。?GavinOrland:Here'swhatgoesonbehindthescenesforexplanation3:functionpareiatO{//FunctiondeclarationhoistedfirstfuMtiotakoi^ted(){returnafunctioia";}//Variablere-assigMd(declarationigMred)koistcd= avanable11;returnkoisted();}console,Iog(parentO);Here'sasourceforthis.源码在这里。BhuvanMalik:Whatyou'retryingtosayiscorrect.However,sayingthatfunctiondeclarationsgethoisted"above"variabledeclarations,whichimpliesthatvariabledeclarations"gethoistedbelow"iswrong.Insuchacase,whatishappeningisthatthehoistingofvardeclarationssimplygetsignored.Iwillupdatethis.?你想证明你说的是对的。然而说函数声明提升在变量声明提升之上,在暗示变量声明"提升在下面"是错的。在这样的情况下,发生的事情就是简单地忽略var声明的提升。我会更新这个。?GavinOrland:I'mnot"trying"tosayanything,I'msimplysayingit:functiondeclarationsarehoistedabovevariabledeclarations.Whatisunclearaboutthat?Yes,thereforevariabledeclarationsarethenlogicallyhoistedbelowfunctiondeclarations,ifyouwanttothinkaboutitlikethat.Itisnotwrongtosaythat—pleaseprovetomethatiswrong.我没有试着说什么,我只是在说:函数声明被提升到了变量声明之上。有什么不清楚的呢?是的,因此变量声明在函数声明下面逻辑地提升,如果你觉得他是这样,那样说也没错--请向我证明我是错的。Inyourfirstreplyyousaid:在你第一次回复中你说:varhoisted="I'mavariable',;comesfirstandthereforethevariable"hoisted"shouldbehoistedfirstwithan“undefined”valueThisisincorrect—adeclarationwillbehoistedafterthefunctionwiththisvalue.Thenthestringvalueisimmediatelyassignedtoit.这是错的一一个声明将在具有这个值的函数之后被提升。然后,字符串值立即分配给它。Indeed,inthecaseofexample3,thedeclarationisignored(incontradictiontoyourexplanation),asIexplained,becausethevariablehasalreadybeendeclaredintheformofthefunction,butinothercases(suchasexample1,whichyoudonotwanttocorrect)functiondeclarationsarehoistedfirst,thenvariabledeclarations.确实,在案例3的情况中,这个声明被忽略(与你的解释相矛盾),正如我所解释的,因为变量已经以函数的形式被声明了,但在其他情况(如示例L您不想纠正)函数声明首先被提升,然后是变量声明。Functionandvariabledeclarationsarealwayshoistedinthismanner,theassignmenttothevariablewilltakeplacewhereveritappearsinthecode.函数和变量声明总是用这样的方式被提升,变量的赋值将在代码中的任何位置出现。It'soddyoushouldacceptmycorrectionandthensomehowclaimyouarerightandIamwrong?!Anyway,Iseeyouhavenowcorrectedthearticle(otherwiseverygood,andthanksforwritingit).这很奇怪,你应该接受我的更正,然后以某种方式声称你是对的,我错了?无论如何,我看你现在己经纠正了这篇文章(其他的非常好,谢谢你写了这些)。BhuvanMalik:Firstofall,thanksforcorrectingmesirandIappreciateyourexplanations.Yousaythatvariabledeclarationwillgethoistedafterthefunctionwithan“undefined"value,andthenthestringvaluewillbeimmediatelyassigned.Mydoubthereisthatwhatifweonlyhavethevariabledeclarationwithoutastringvaluebeingassignedlikeso:首先,感谢先生纠正我,我感谢你的解释。你说那个变量声明在函数之后被赋值-undefined",然后字符串值将立即分配。这里我的疑问是,如果我们只有变量声明没有被赋值的字符串值,如下所示:functionparentQ(varhoisted;return叩鹏afunctioi^H;]returnhoisted。;}console.Iog(parent());Ifvariabledeclarationdoesgethoistedafterthefunction,thenbehindthescenesforthisaccordingtoyourexplanationshouldbe:如果变量声明在函数之后被挂起,那么根据你的解释,这个后台应该是:functionparent。{//Hoistedfirstfunctionhoisted(){return"I'mafunction.";)//Hoistedsecondwithavalueofundefinedvarhoisted;returnhoisted。;}console.Iog(paretf\t());Ifthevariabledeclarationisindeedhoistedsecond,thenhoistedshouldfinallygetthevalueof“undefined"afterthehoistingofthefunctionandtheprogramshouldfinallythrowanerrorbecausehoistedisnolongerafunction.如果变量声明确实是第二次提升的话,那么在提升函数后最终得到的值是"undefined",程序最终会因为提升函数而抛出一个错误。However,theoutputstillcomesouttobe"I'mafunction".然而,这里输出的是"I'mafunction"ThisisthereasonwhyIthinkthereisnovariabledeclarationhoistinghappeninghere.Iagreethatavariabledeclarationhoistinginsuchacasesimplygetsignored.Gettingme?Again,Icouldbewrong.I'mjusttryingtolearnherebydiscussingwithyou.就是这个原因我认为变量声明没有提升。我同意,在这种情况下提交的变量声明只是被忽略。再联系我?再次,我可能是错的。我只是想通过讨论和你一起来学习。GavinOrland:Noproblem,Icanexplainthis.InfactIthinkwehavealreadycoveredit,really.没问题,我能解释这个。事实上我认为我们已经把它覆盖了,真的。Variabledeclarationsarehoistedafter(orbelow)functiondeclarations.But,inthecasewherethenamesmatchfunctiondeclarations(oranyvariablealreadydeclared),theyhavenoeffect,soareignored.变量声明在函数声明之后(或者下面)被提升。但是,在名称匹配函数声明的情况下(或任何已经声明的变量),它们没有效果,因此被忽略了。So,redeclaringavariabledoesnotrenderitundefined,ithasnoef

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论