JavaScript 预解析的原理及实现

  事实上或某种现象证明并不是这样的,通过《JavaScript权威指南》及网上相关资料了解到,JavaScript有“预解析”行为。理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在。为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正。


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

  function showMsg { alert('This is message'); } showMsg; // This is message

  (2) 我们也知道函数可以定义在调用代码之后,如下代码也是能正常工作的。看起来调用showMsg的时候showMsg还是没有定义的,但能正常工作,则表明JavaScript是“预解析”的。

  showMsg; // This is message function showMsg { alert('This is message'); }

  (3) 上面是函数的例子,下面再来一个普通变量的例子。以下例子运行将会弹出undefined,表明第一句的msg已经是定义了,只是没有初始化,它与var msg; alert(msg);是一样的。如果你把下面第二句注释掉,则会报“msg未定义”错误。这亦表明JavaScript是“预解析”的。

  alert(msg); //undefined var msg='This is message';

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

  showMsg; // This is message 2 function showMsg { alert('This is message 1'); } showMsg; // This is message 2 function showMsg { alert('This is message 2'); }

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

  function showMsg { var msg='This is message'; } alert(msg); // msg未定义

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

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

时间: 2024-12-22 14:36:13

JavaScript 预解析的原理及实现的相关文章

理解 JavaScript 预解析_javascript技巧

事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有"预解析"行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript"预解析",如果我的见解有误,还望指正. (1)如果JavaScript仅是运行时自上往下逐句解析的,下面的代码能正确运行是可以理解的,因为我们先

JavaScript预解析及相关技巧分析_javascript技巧

本文实例讲述了JavaScript预解析及相关技巧.分享给大家供大家参考,具体如下: 变量 同样,以这两个小例子的错误对比提示开始. alert(y1); //代码段1 var y1 = 'dddd'; alert(y2); //代码段2 // alert(typeof y2); y2 = 'xxxxx'; 先思考一下,为什么一个会提示 undefined , 一个却抛出变量未定义的错..先看JavaScript的解析过程. javascript在执行过程之前,会做一件事件"预解析".

跟我学习javascript的var预解析与函数声明提升_javascript技巧

1.var 变量预编译 JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对"先声明.后使用"的规则很熟悉,如果使用未经声明的变量或函数,在编译阶段就会报错.然而,JavaScript 却能够在变量和函数被声明之前使用它们.下面我们就深入了解一下其中的玄机. 先来看一段代码: (function() { console.log(noSuchVariable);//ReferenceError: noSuchVari

高性能JavaScript模板引擎实现原理详解_javascript技巧

随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter.淘宝网.新浪微博.腾讯QQ空间.腾讯微博等大型网站中均能看到它们的身影. 本文将用最简单的示例代码描述现有的 javascript 模板引擎

js-JS作用域和预解析之间的运作模式

问题描述 JS作用域和预解析之间的运作模式 JS作用域和解析器之间是怎么运转的,看到作用域一换就会预解析,然后找关键字什么的,变量重名还要区分是不是一个东西,好乱啊 解决方案 js怎么运作是解释器实现者的事,也就是我不管你怎么实现,有没有预解析,总之必须按照语言规范,什么样的代码,执行结果是怎么样,这个是确定的,作用域和关键字是语言规范规定的.无论解释器怎么实现,这些都是固定不变的(除非解释器有bug) 对于学习js来说,只要学习后者就可以了. 解决方案二: javascript运行机制浅析

javascript如何解析base64图片数据 并且将图片显示在网页中

问题描述 javascript如何解析base64图片数据 并且将图片显示在网页中 最好是有详细的javascript解析base64的源代码(本人初学者请见谅),显示这一块儿 怎么获取javascript解析好的图片 麻烦各位大神了 急!急!急! 解决方案 var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var base64DecodeChars =

Javascript动画的实现原理浅析

 这篇文章主要介绍了Javascript动画的实现原理浅析,本文用两个实例来解释Javascript动画的实现原理,需要的朋友可以参考下     假设有这样一个动画功能需求:把一个div的宽度从100px变化到200px.写出来的代码可能是这样的: 代码如下: <div id="test1" style="width: 100px; height: 100px; background: blue; color: white;"></div>

原生javascript实现解析XML文档与字符串_javascript技巧

之前写过一篇 <使用jquery解析XML的方法>链接是http://www.jb51.net/article/54842.htm,上篇文章详细解释了jQuery 与字符串互相转换的方法 ,这里着重论述javascript操作xml. 总代码如下: var XMLHttp = null; if (window.XMLHttpRequest) { //现代浏览器 XMLHttp = new XMLHttpRequest(); } else if (window.ActiveXObject) {

JavaScript处理解析JSON数据过程详解_javascript技巧

JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包. JSON的规则很简单: 对象是一个无序的"'名称/值'对"集合.一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"后跟一个":"(冒号):"