`
smiky
  • 浏览: 257811 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

js预编译和执行期的问题

 
阅读更多

 

var foo = 1;    
function bar() {    
    if (!foo) {    
        var foo = 10;    //如果这里不加var就是1了,加了var后在预编译时foo会被当做局部变量进行索引,可能有同学基
础和我一样不是太好的,在想我外部定义了一个变理,在内部使用都是好好的啊,那你一定要注意了,这里多了个var
    }    
    alert(foo);    
}    
bar();  

 

 

var a = 1;    
function b() {    
    a = 10;    
    return;    
    function a() {}    //同理a在这里被重新索引
}    
b();    
alert(a);  
 

下面引用某位同学的回答,个人觉得讲的很清楚了:

预编译和执行期的问题。javascript会分块的进行预编译,预编译期会处理所以使用var声明的变量以及使用function的函数会被处理,但var声明的变量只进行索引,而不处理赋值,赋值在执行期处理,而function的函数会处理函数体。
所以第一个例子:预编译期间建立索引foo和处理bar函数体,但foo未赋值,所以foo为undefined。然后执行期给foo赋值1,执行bar()时,先预编译函数体内的内容,建立局部变量索引foo,但未赋值,所以foo=undefined,此时执行期bar(),由上往下执行,结果自然为10.
而第二个例子类似,因为执行期到b()时,会预编译b里面的内容,此时function a(){}相当于(类似)var a,即也建立局部变量的索引a,所以执行期给局部变量的a赋值10,并不影响全局的a

分享到:
评论
5 楼 faithLove 2016-04-09  
我明白了,摘自http://www.jb51.net/article/76509.htm这个链接:javascript预编译中function语句定义的函数,不仅声明了函数名,而且函数体也进行了处理,所以在解释执行的阶段时,a的值再次被覆盖为1。
例如:var f = function(){    // 定义匿名函数f 
return 1; }
alert(f());       // 返回1
function f(){      // 声明函数f 
return 2; }
alert(f());      // 返回1
4 楼 faithLove 2016-04-09  
代码块:var a = 1;     
function b() {     
    a = 10;     
    return;     
    function a() {}    //同理a在这里被重新索引 
}     
b();     
alert(a); //1
我还是不明白,结果为啥是1,而不是10呢。
按你上面说“在执行该function的时候就会起作用”,b()那行代码不是执行了function b()的函数体吗?a没有var的声明,b函数体内的a不是应该是全局a吗?因为全局已经有a存在,所以1值不是覆盖掉吗?
3 楼 smiky 2012-07-02  
loveelwin 写道
再补充一下,我说的对所有代码预编译是要分块的。也就是按块编译期,执行期;编译期,执行期。。。。

js是按块预编译的,也就是碰到一个<script></script>就来一次,这位同学的学习态度实在是太好了,谢谢啊
2 楼 loveelwin 2012-07-02  
再补充一下,我说的对所有代码预编译是要分块的。也就是按块编译期,执行期;编译期,执行期。。。。
1 楼 loveelwin 2012-07-02  
谢谢你引用我的答案,但是回答有一点点小问题,大致的意思还是不变的。
就是:
并不是执行函数时才对函数进行预编译,而是js会先对所有的代码进行预编译(预编译期),再进入执行期。在js的预编译期会对所有的var变量和function函数进行处理(包括对变量名进行索引和对function函数体进行解析),function函数体内部语句和相关的逻辑解析后,会存储在函数变量所指向的地址中,所以不会对全局的变量产生影响。但在执行该function的时候就会起作用。
其他的基本和之前说的一个意思。

相关推荐

    WEB面试题汇总.pdf

    - 预处理器Sass、LESS:用于编译复杂的CSS代码,提供变量、嵌套、混合等高级功能。 - display和position属性的区别及其用法。 - BFC(块级格式化上下文):用来避免浮动元素对其他元素的布局影响。 - 盒模型的...

    javascript运行机制之执行顺序理解

    JavaScript的运行机制主要涉及到代码块、函数声明与赋值、预编译期和执行期等核心概念。首先,我们从代码块开始。 1. **代码块**:在JavaScript中,代码块通常指的是由`&lt;script&gt;`标签包裹的代码段。每个`&lt;script&gt;`...

    深入理解javascript的执行顺序

    这就引出了JavaScript的解析过程的两个阶段:预编译期和执行期。在预编译期,JavaScript引擎会对当前作用域中的所有变量声明和函数声明进行处理。这一阶段,函数声明会被提升到作用域的顶部,而变量声明则会被提升但...

    JS-Native交互电子书

    这种模式下,JavaScript(简称JS)与原生端(Android和iOS)之间的交互成为了一个重要的课题。 #### 一、JS与原生端交互基础知识 **1.1 JS基础** - **基本概念**:JavaScript是一种轻量级的解释性或即时编译的...

    基于强度导向的JavaScript代码协同混淆方法.pdf

    但是,JavaScript代码也面临着恶意攻击和反编译的风险,代码混淆技术可以很好地解决这个问题。本文提出基于强度导向的JavaScript代码协同混淆方法,可以protect JavaScript代码,防止恶意攻击和反编译。 代码混淆...

    typeScript学习笔记

    TypeScript支持所有的JavaScript语法,兼容性好,且可以在编译期去掉类型和特有语法,生成纯粹的JavaScript代码。 TypeScript的特点: * 是JavaScript的一个超集 * 扩展了JavaScript的语法 * 向JS中引入了类型的...

    JS声明式函数与赋值式函数实例分析

    JS的解析过程分为两个阶段:预编译期(预处理)和执行期。在预编译期,声明的变量和声明式函数被提取并处理。而在执行期,代码按顺序逐行执行。对于赋值式函数,只有在执行到函数表达式所在的行时,函数才会被创建。...

    babelpluginpreval在构建期预先评估代码

    **标题解析:** "babelpluginpreval在构建期预先评估代码" 指的是一个名为 `babel-plugin-preval` 的JavaScript开发工具,它在项目构建过程中执行代码的静态评估。 **描述解读:** "babel-plugin-preval 在构建期...

    网页设计与制作(HTML+CSS+JS)-3期(KC003) 网页设计与制作 html5+CSS3+JavaScript 第1章

    它不是程序设计语言,不进行编译或执行,因此A、B、C错误。HTML文档由各种元素和标签构成,它们定义了网页的各个部分,如标题、段落、图像等。 动态网页制作技术包括PHP、JSP和ASP.NET,它们允许服务器端处理数据并...

    fis-prepackager-derived:将编译期新“派生”出来的文件添加到release列表

    在这个过程中,原始的源文件可能通过各种方式产生新的衍生文件,如CSS预处理器(如Sass或Less)生成的CSS文件,或者JavaScript模块打包器(如webpack或Rollup)合并后的JS文件。这些衍生文件对于最终应用的运行是必...

    kotlin-compiler-1.9.22

    6. 编译器插件支持:1.9.22版编译器增强了对插件的支持,开发者可以更方便地创建和使用自定义的编译期逻辑,实现代码的自动生成或特定的代码优化。 三、Kotlin的生态系统 Kotlin不仅有强大的编译器,还有丰富的...

    Java以及部分js课件

    10. **枚举与注解**:了解枚举类型和其在Java中的使用,学习注解的概念及其在编译期和运行期的作用。 11. **Java EE**:对于进阶学习者,可能还会涉及Java服务器端编程,如Servlet、JSP、JNDI、EJB、JMS等,这些都...

    VbsEdit+v3[1][1].3.1.8

    1. **VBScript基本概念**:VBScript是Microsoft开发的一种脚本语言,基于Visual Basic,它不需预编译,可以在运行时动态解释执行。主要应用领域包括ActiveX Data Objects (ADO) 数据访问,Internet Explorer浏览器中...

    node-v16.15.0-win-x64.zip

    “win-x64”表明这个版本的Node.js是专门为64位Windows系统编译的,它可以充分利用64位系统的内存资源,处理大型数据和复杂任务时表现出更好的性能。 4. **安装与使用**: 解压“node-v16.15.0-win-x64.zip”后,...

    PHP杂志(16~20)

    4. PHP与数据库交互:介绍如何使用PDO或MySQLi扩展连接和操作数据库,执行SQL查询,处理结果集,以及事务处理和预编译语句,确保数据安全。 5. PHP框架应用:可能涉及了诸如Laravel、Symfony、Yii等流行的PHP框架,...

    JavaScript中文教程

    - **浏览器兼容性问题**: 不同版本的浏览器对 JavaScript 的支持程度有所不同。例如,早期版本中可用的一些功能,在后续版本中可能会发生变化或者不再支持。此外,某些功能(如 `Date` 对象)在不同操作系统(如 Mac...

    JavaScript中this指向.pdf

    首先,需要明确的是,在JavaScript中,this关键字的指向不是在编译期确定的,而是在运行期确定的。这与大多数主流的面向对象语言(比如Java和C#)不同,在那些语言中this关键字在编译期就已绑定到当前对象上。由于...

    基于ssm+mysql线上会议管理系统源码数据库.docx

    - **面向切面编程(AOP)**:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 2. **SpringMVC的工作流程**: - 用户发送请求至前端控制器DispatcherServlet; - DispatcherServlet通过...

Global site tag (gtag.js) - Google Analytics