预编译期和执行期

在javascript中执行如下代码:

var a = 10;

function outer(){

alert(a);

var a = 20;

}

outer();

会产生一个奇怪的结果undefined.其实这是代码执行的两个过程及作用域的问题。

代码执行的两个过程:

预编译期:声明变量、定义函数、创建函数空间

执行期  :变量赋值、语句执行

对于以上代码,在预编译期,声明一个全局变量a,定义函数outer(),声明一个局部变量a;

在执行期,执行outer(),执行alert(a),该语句会首先在outer()的局部环境中寻找a,于是找   到了预编译期的第二个a,由于alert(a)在var a = 20 之前,所以此时的这个a 是出于undefined状   态,所以结果就是undefined了。

时间: 2024-08-03 16:53:09

预编译期和执行期的相关文章

JavaScript的预编译和执行

JavaScript引擎,不是逐条解释执行javascript代码,而是按照代码块一段段解释执行.所谓代码块就是使用<script>标签分隔的代码段. 整个代码块共有两个阶段,预编译阶段和执行阶段 一.编译阶段 对于常见编译型语言(例如:Java)来说,编译步骤分为:词法分析->语法分析->语义检查->代码优化和字节生成. 对于解释型语言(例如JavaScript)来说,通过词法分析和语法分析得到语法树后,就可以开始解释执行了. (1)词法分析是将字符流(char strea

c语言学习笔记---预编译

专题三: 1)       预编译 处理所有的注释,以空格代替, 将所有的#define删除,并且展开所有的宏定义, 处理条件编译指令#if,#ifdef,#elif,#else,#endif 处理#include,展开呗包含的文件, 保留编译器需要使用的#pragma指令, 预处理指令:gcc-E file.c –o hello.i 编译: 对于处理文件进行一系列词法分析,语法分析和语义分析 语法分析主要分析关键字,表示符,立即数是否合法,语法分析主要分析表达式是否遵循语法规则 语义分析子啊语

预编译

javascript预编译部分 JavaScript当中不向其他的语言一样,在js中我们会看到一些奇怪的现象就像我们可以在函数声明之前去访问这个函数的名字,并且能够打印出函数体,而且我们还能在变量声明之前去访问这个变量,虽然值是一个undefined但是并没有报错,这些特殊的情况,归结于函数的预编译过程. console.log(foo); function foo(){} 这样的一段代码,根据javascript解释执行的情况,本应该是报错的,因为找不到函数的啊.但是这里的并没有报错,这里打印

js的预编译、全局变量、局部变量相关知识

1.未声明的变量就赋值, 此变量归全局变量window对象所有 console.log(a); //a is not defined a=10 console.log(a); //10 等价于 console.log(window.a) function test(){ var a = b = 123; } test(); console.log(b) //123 b未声明就赋值归为window对象所有, 等价于console.log(window.b); console.log(a) //a

预编译、作用域链和闭包理解

在理解预编译之前,首先了解一下JS的解析过程:JS引擎在解析脚本的过程分为两个阶段,预编译和执行,首先预编译然后再从上之下一行一行的执行代码.其次,要了解作用域,作用域是一个变量或者函数能够使用的空间,分为全局作用域和局部作用域,全局变量的作用域为全局作用域,局部变量(函数内部或者ES6块内部的变量)的作用域为局部作用域. 预编译分为全局预编译和函数预编译,我们来详细的了解一下. 全局预编译分为两步: 1.生成全局对象:(Global Object)  GO = {   }: 2.找变量声明和关

JavaScript 之 预编译 作用域,作用域链

第一次写博客,本来是学习jQuery遇到闭包问题,发现并没有理解闭包,发现闭包牵扯的知识点太多.复习了一遍(发现自己该记住的全忘了)写在博客里,自己也是小白,希望大神们指点迷津,必将感激不尽. 我们知道JavaScript有两个特点:单线程,解释型语(翻译一行,解释一行).但其实翻译一行,解释一行是最后一部才这样做,在这之前会有一个语法分析:通篇扫描看有没有语法错误,但不执行,通篇扫描之后,会进行 预编译 然后 -->解释一行,执行一行.这就是我们所说的js运行三部曲:语法分析     预编译 

js 预编译环节的变量提升

有些东西需要先告诉你怎么用,再去理解定义 关于变量的提升 function test () { console.log(a) var a = 100 console.log(a) }; test () // undefined // 100 执行步骤 function test () { var a = undefined console.log(a) a = 100 console.log(a) } 关于函数的提升 function test () { console.log(a) funct

Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)

注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处理.apt是命令行工具,与之配套的是一套描述"程序在编译时刻的静态结构"的API:Mirror API(com.sun.mirror.*).通过Mirror API可以获取到被注解的Java类型元素的信息,从而提供自定义的处理逻辑.具体的处理工具交给apt来处理.编写注解处理器的核心是两个

一张图掌握移动Web前端所有技术(大前端、工程化、预编译、自动化)

你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa 跨终端技术:HTML 5.CSS 3.JavaScript 跨平台框架:React Native.Cordova 前端工程化:Grunt.Gulp.Webpack 前端预编译:Babel.Sass.Less 自动化测试:Jasmine.Mocha.Karma 一图在手,应有尽有! 更多信息参考:https://item.jd.com/12170351.h