示例代码如下:
var d = '全局的';
(function(){
 alert(d == undefined);//结合步骤4
 var d = 123;
})();
(function(a){
 var a;
 alert(a == 123);//结合步骤1,4;
})(123);
(function(){
 alert(typeof a == 'function');//结合步骤2,4;
 function a(){}  //这句换下面,结果还是一样
 var a = 234;
})();
(function(){
 alert(typeof a == 'function');//结合步骤2,4
 var a = 234;//这里赋值是在函数初始化完成后执行阶段完成的,因此下面a的类型变成了number
 alert(typeof a == 'number');//并没有违反步骤2,4规则,由于这是在执行期间判断的,上面的逻辑已经将a改变了
 function a(){}
})();

函数执行前期初始化变量环境走了如下过程:
1、遍历参数列表,添加到函数变量环境并赋值。
2、遍历函数声明,如果函数变量环境中存在则赋值,不存在则添加并赋值。
3、添加arguments并赋值【这里不同浏览器表现差异较大,并不一定都是这样】
4、遍历函数中所有的变量声明,如果变量环境中存在则不作任何操作,不存在则添加并赋值undefined。
这四个步骤完成后,函数才开始真正执行相关逻辑,所有的赋值语句才开始从上往下生效。
手打累了,不打了,看到这里应该也明白了函数声明提前问题了

转载于:https://www.cnblogs.com/huzhiming/archive/2012/12/07/2806849.html

javascript函数执行前期变量环境初始化过程相关推荐

  1. 【译】理解Javascript函数执行—调用栈、事件循环、任务等

    原文作者:Gaurav Pandvia 原文链接:medium.com/@gaurav.pan- 文中部分链接可能需要梯子. 欢迎批评指正. 现如今,web开发者(我们更喜欢被叫做前端工程师)用一门脚 ...

  2. 「译」理解Javascript函数执行—调用栈、事件循环、任务等

    现如今,web开发者(我们更喜欢被叫做前端工程师)用一门脚本语言就能做任何事情,从提供浏览器中的交互,到开发电脑游戏.桌面工具.跨平台移动应用,甚至可以在服务端部署(如最流行的Node.js)来连结任 ...

  3. 从JavaScript函数重名看其初始化方式

    今天有个哥们问我要是JavaScript函数重名了会有什么后果?开始我没有细想,就说可能会出错吧,可是等我实验完了发现页面没有任何脚本错误提示,而且程序也运行了,只是对同名函数的调用执行了位置靠后的一 ...

  4. [译]深入理解JavaScript函数执行—调用栈,事件循环和任务等

    Web 开发者,或者前端工程师(我们更喜欢别人这么称呼)现如今几乎能做所有的工作,从扮演一个浏览器内部交互性的角色,到制作电脑游戏.桌面控件.跨平台手机应用,甚至还可以把它写在服务器端(最流行的是no ...

  5. Javascript函数执行、new机制以及继承

    JS函数执行 一个JavaScript函数fn,被执行有三种途径: fn() new fn() fn.call()或fn.apply() new机制以及继承 JavaScript中定义了一种对象,称之 ...

  6. php初始化函数赋值,PHP变量的初始化以及赋值方式介绍

    什么是变量 变量通俗的来说是一种容器.根据变量类型不同,容器的大小不一样,自然能存放的数据大小也不相同.在变量中存放的数据,我们称之为变量值. PHP 中的变量用一个美元符号后面跟变量名来表示.变量名 ...

  7. shiro web环境初始化过程

    在web工程中使用shiro的时候需要配置一个shiro的listenser(EnvironmentLoaderListener)和一个shiro的filter(ShiroFilter). liste ...

  8. Javascript函数内静态变量与实例变量

    严格的来讲,js里面并没有静态与私有的概念,所有成员属性都是公开的,下面只是参考java语言,通过某种方式来实现类似的概念. 静态变量 1.私有静态变量 所有实例共享.因为是私有的变量,所以不能通过函 ...

  9. javascript的执行上下文

    https://juejin.im/post/5ba32171f265da0ab719a6d7 https://juejin.im/entry/599867b2518825241e220eaa 我只是 ...

最新文章

  1. python语言代码片段-有用的Python代码片段
  2. C++流操纵算子(格式控制)
  3. linux 用户态 spinlock,spinlock作用
  4. 你的手机上未安装应用程序”的解决方案
  5. 常用MIME类型,解决IIS布署后字体文件、mp4视频文件等not found 的错误
  6. java 蓝桥杯算法训练 秘密行动
  7. postgresql cast转换类型
  8. java求最小步数_关于java:查找两点之间的最小步数?
  9. 【安装包】gcc编译器
  10. 商厂里调货拿包包程序
  11. 大一计算机期末考试高数试卷,大一高数期末考试试题
  12. SAS9.3安装经验
  13. deepfacelive实时AI换脸直播使用教程
  14. 机器学习(周志华) 第十六章强化学习
  15. 台风怎么看内存颗粒_使用300多元的D4 16G内存是种什么体验
  16. html5s做表单,5S推行手册表单.doc
  17. 计算机主机上有几个按钮,键盘按键有什么功能 电脑键盘上各个按键功能详解...
  18. 基于ThreeJS的3D地球
  19. LWN:替换 congestion_wait()!
  20. 有关爬虫加载Ajax数据或请求json数据集的(快速高效)方法

热门文章

  1. 视频号直播带货成交的三大关键
  2. C++语言的技术性规则
  3. 如何在github上下载某个项目的单独某个目录
  4. SQL Server便利名称
  5. sql server 入门_SQL Server查询调整入门
  6. ssas计算度量_如何在Analysis Services(SSAS)中创建中间度量
  7. node.js下npm安装太慢,如何解决
  8. Spring MVC起步(一)
  9. 洛谷2657 windy数(数位DP)
  10. python脚本打包成exe可执行文件