JS预处理阶段、执行阶段的理解

预处理阶段涉及到变量和(以函数声明方式声明的)函数的声明的提前的原理,并且涉及到声明变量冲突时候的一些问题。需要与执行阶段进行一定的区分,进而加深理解。

1. 预处理阶段将变量保存在window域中,会扫描用var操作符声明的变量以及用函数声明的方式声明的函数指针。因此会产生变量提前和函数声明提前的效果。

需要说明的是:

  • 如果变量并没有用var声明,如b = 1;那么即使在函数执行阶段将其默认为全局变量,在预处理阶段也不会将其添加到window域中。直到执行到这一条语句的时候,才会将其和对应的值添加。
  • 函数表达式用var声明,所以处理方式与用var声明的其他变量一样。
  • 这段代码:
var a = 1;
     b = 2;

function f (){console.log("11");}

var g = function(){console.log("22");};

  在预处理阶段window域的情况:

window{
    f : 指向函数,
    a : undefined,
    g : undefined
}

  在执行阶段window域的情况:

window{
    f : 指向函数,
    a : 1,
    b : 2,
    g : 指向函数
}

2. 如果声明发生冲突。那么在预处理的时候遵循两个规则:a. 先扫描函数,再扫描var声明的变量;b. 如果与之前的声明发生冲突的是函数,则覆盖;如果是var声明的变量,则忽略,如下面这段代码:

alert(f);
function f(){ console.log("11"); }
var f = 1;

  alert的将是"f(){console.log("11");}

时间: 2024-10-24 13:10:42

JS预处理阶段、执行阶段的理解的相关文章

js函数自动执行的一点理解

//声明一个匿名函数并赋值给一个变量 var a = function(){ console.log("executing..."); } //匿名函数调用 a(); 相信上面这段代码大家都能看明白,再看下面这段代码 console.log(a() === (a)()); //结果true 于是,下面这段代码也就不难理解了 (function(){ console.log("executing..."); })(); 但是 //结果"缺少标识符"

JS中的预编译(词法分析)阶段和执行阶段

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预

Nginx Lua的执行阶段

对刚接触Ngx_lua的读者来说,可能会存在下面两个困惑. 1.Lua在Nginx的哪些阶段可以执行代码?Lua在Nginx的每个阶段可以执行哪些操作? 2.只有理解了这两个问题,才能在业务中巧妙地利用Ngx_Lua来完成各项需求. Nginx的11个执行阶段,每个阶段都有自己能够执行的指令,并可以实现不同的功能.Ngx_Lua的功能大部分是基于Nginx这11个执行阶段开发和配置的,Lua代码在这些指令块中执行,并依赖于它们的执行顺序.本章将对Ngx_Lua的执行阶段进行一一讲解. 一. in

自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)

将陆续上传新书<自己动手写CPU>,今天是第42篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 9.3.2 修改执行阶段 1.修改EX模块 在执行阶段的EX模块会计算加载存储的目的地址,参考图9-19可知,EX模块会增加部

javascript运行过程中的“预编译阶段”和“执行阶段”

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行), 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预编译中,javascript对这两种声明做出了两种处理方案 <scri

理解JS引擎的执行机制

首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 : JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 技术的出现,都跟现实世界里的应用场景密切相关的. 同样的,我们就结合现实场景,来回答这三个问题 (1) JS为什么是单线程的? JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的. 场景描述: 那么现在有2个线程,process

OpenResty--------核心执行阶段篇

前言 前两篇分别介绍了OpenResty核心概念和,优势与架构等信息,进行本篇之前建议至少观看一遍. OpenResty--------企业级理论实践篇 OpenResty--------企业级入门实践篇 背景 之前篇章介绍了OpenResty是基于Nginx为基础核心的开发平台,本篇将继续介绍基础平台(Nginx)的主要特性. 特性 执行阶段 OpenResty将应用分为4个大阶段,11个小阶段,如下图所示. 初始化阶段: master进程启动预加载/生成worker进程预加载 转发/访问阶段

10分钟理解JS引擎的执行机制

10分钟理解JS引擎的执行机制 javascript 阅读约 7 分钟 深入理解JS引擎的执行机制 1.灵魂三问 : JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.说说setTimeout 首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 : JS为什么是单线程的

测试执行阶段一般要做哪些事情?

什么是测试执行?测试执行在实际工作过程中一般指1)测试用例编写完成2)测试数据准备完成3)开发完成开发.自测.提测4)测试环境搭建完毕以上四点完成之后,接下来要做的具体工作测试执行阶段要做的事情:1.对软件进行冒烟测试,也叫做预测试2.根据测试方案和测试策略.计划 进行软件的功能测试,执行测试用例3.记录测试结果4.讨论定位确认发现的问题5.发散测试(测试时间充裕的情况下)6.文档测试7.测试总结报告http://www.bcbxhome.com/bcbx/forum.php?mod=viewt