JS执行过程

1、首先是预解析:预解析过程最重要的是提升,在JavaScript代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作

2、执行操作

全局中解析和执行过程

<script>
console.log(a);//undefined===>window.a
console.log(b);//b is not defined
console.log(fn1);//会打印函数===>window.fn1
console.log(fn2);//undefined===>window.fn2
var a = 1;
b = 2;
function fn1() {
console.log('函数1');
}
var fn2 = function () {
console.log('函数2');
}
</script>
<script>
var a;
console.log(window);
</script>

<script>
var a = 1;
console.log(window);
</script>

上述例子有变量有函数(在全局作用域下):

1、对于有var声明的函数,就等同于window.a,相当于在js第一次扫描代码时候(预解析),给window添加了一个a的属性,但是没有赋值,所以打印结果是undefined

2、对于没有var声明的函数,在js第一次扫描代码时候(预解析)不会给windouw添加任何属性,所有会直接报错

3、对于以function开头的函数,就等同于window.fn1,相当于在js第一次扫描代码时候(预解析),给window添加了一个fn1的属性,而且是直接赋值的(函数的引用),所以打印结果是一个函数

4、对于没有以function开头的函数(也就是函数表达式),其过程相当于var a的过程,在js第一次扫描时(预解析),给window添加了一个fn2的属性,但是没有赋值,所以打印结果是undefined

命名冲突

<script>
console.log(f);//打印函数
var f = 1;
function f(){
console.log('foodoir');
}
</script>
<script>
console.log(f);//打印函数
function f(){
console.log('foodoir');
}
var f = 1;
</script>
<script>
console.log(f);//undefined
var f = 1;
var f = 2;
</script>
<script>
console.log(f);//打印第二个函数
function f(){
console.log('foodoir');
}
function f(){
console.log('hello world');
}
</script>

1、函数与变量命名冲突时,变量会被直接忽略,保留的永远的都是函数

2、函数与函数命名冲突时,最后的函数会替换之前的函数

3、变量与变量命名冲突时,永远都是undefined

 函数中的解析与执行过程

<script>
function f(a, b) {
alert(a);
alert(b); var b = 100; function a() {
}
}
f(1, 2);//依次弹出function a(){}以及2
</script>
<script>
function f(a, b) {
alert(a);
alert(b); var b = 100; function a() {
}
}
f(1);//依次弹出function a(){}以及undefined
</script>

函数中的解析过程与全局类似

1、在第一次扫描js代码时,首先会将a变量提升,但是扫描到最后发现有函数a,这里有命名冲突,那么就会直接将变量忽略

2、b变量没有命名冲突,但是第一次扫描后,b只是提升并没有赋值,所以上面代码段一中,正式执行代码的时候就会弹出2

最新文章

  1. var a=b=c=1; 和 var a=1, b=2, c=3; 的区别。
  2. JAVA_jdk下载和环境变量的配置
  3. 数据存储_ SQLite(3)
  4. UIautomator Python测试
  5. noip2008 双栈排序
  6. as3资源加载-Loader和URLLoader
  7. Oracle DB 管理数据库的空间
  8. lnmp.org一键安装包
  9. pyqt sender()学习
  10. C#中in,out,ref,params的作用和区别
  11. Android核心基础(十一)
  12. 转载 C语言中volatile关键字的作用
  13. 英语学习APP案例分析
  14. .Net开发小技巧
  15. Java8 方式解决Stream流转其他数组
  16. ROS tf
  17. linux块设备驱动
  18. js 对call apply bind理解
  19. sql中exists和not exists的用法
  20. day9--回顾

热门文章

  1. B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因
  2. HDU——1267 下沙的沙子有几粒?
  3. MYSQL中有关数据库的简单操作
  4. SpringMVC断言--Assert
  5. CocoaAsyncSocket网络通信使用之数据编码和解码(二)
  6. CSS经典布局之弹性布局
  7. ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值
  8. Mongo性能测试-python脚本
  9. POJ 3221 Diamond Puzzle.
  10. luogu1641 [SDOI2010]生成字符串