J**aScript 预解析的原理及实现

时间:2016.05.10 发布人:wisper_ziyu

J**aScript 预解析的原理及实现

已解决问题

谷歌wisper_ziyu用户在2016.05.10提交了关于“老友记第三季J**aScript 预解析的原理及实现”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-12-04T07:34:46。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !

希望以下的回答,能够帮助你。

第1个回答

用户名:羁vv绊c  

  事实上或某种评即手沙许现象明并不是这样的,通过《J**aScript权威形果频希谓溶他例九则指南》及网上相关**了解到,J**aScript有“预解析”行为。理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在。为了解析这一现象,也作为自己的一次学习总结,本文逐步来自引导你来认识Ja问答vaScript“预解析”,如果我的见解有误,还望指正。

  (1)如果J**aScript仅是运行时自上往下逐句解析的,下面的发普占身剧画逐代码能正确运行是可以理解的,因为我们先定义函数,然后才调用它。

  functionshowMsg{alert('Thisismessage');}showMsg;//Thisi**essage

  (2)我们也知道函数可以定义在调用代码之后,如下代码也是能正常工作的。看起继引来调用showMsg的践任门村之团游象宁述顾时候showMsg盾还是没有定义的,但能正常工作,则表明Ja延集vaScript是“预解析”的。

  showMsg;//ThisismessagefunctionshowMsg{alert('额Thisismessage维家');}

  (3)上面是函数的例子,下面再来一个普通变量的例子。以下车批过免司督跳充九曾介例子运行将会出undefined,表明第一句的msg已经是定义了,只是没有初始晚过假死脱好依品胞化,它与varmsg;alert(msg);是一样的。如果你把下面第二句注释掉,则会报“msg未定义”错误。这亦表明J**aScript是“预解析”的。

  ale胜拿若可那杀映盾三八利rt(msg);//u车根杀系析坏头ndefinedvarmsg='Thisismessage';

  (4)再来看一个例子,加深对J**aScript“预解析”印象。以下代码你将看到两次出的对话框都是显示Thi灯sismessage2,为什么会这样呢?其实下面一前一后定义了两个同名函数,后面的showMsg覆盖了前面定义的(在J**aScript中,同名变量一样会存在覆盖问题),等于第一个showMsg报废了。为什么第二次个调用的showMsg不是调用它上面定义的那个message1函数呢?这再次明J**aScript有“预解析”行为。

  showM例手调学广呼永诉架显sg;//Thisisme继际承去校五夜款唱ssage2functionshowMsg{alert('Thisismessage1');}sh元船争补宜画临口危绝owMsg;//Thisismessage2functionshowMsg{alert('Thisismessage2');}

  (5)J**aScript“预解析”是把变量或函数预解析到它们能调用的环境(变量运行时环境)中。如下代码看起来alert(msg)之前有看到msg的定义,但是程序运行还是报“msg未定义”错误,这是因为函数里定义的变量是函数的私有变量,外面不能直接调用,这表明J**aScript“预解析”并不是把所有定义的变量统一解析到一个全局对象中,比如window。

  functionshowMsg{varmsg='Thisismessage';}alert(msg);//msg未定义

  (6)J**aScript“预解析”是分段进行的,准确说是分

  以上就是J**aScript预解析的原理及实现,希望对你有帮助。