JavaScript预解析

JavaScript的预解析

1.Javascript语言的运行流程<就目前知识而言>

  Javascript是一门单线程的解释性语言.在被浏览器JS引擎解读的时候,Javascript不会立即执行,而是先扫描代码,检测代码语法是否有错误.如果语法没有错误,就会将所有的声明的变量和函数进行声明提升.声明提升即把变量和函数提升到所有的代码的最开头.只有使用var定义的变量function关键字声明的函数才会声明提升,其中变量在提升声明的时候不会赋值,默认值是undefined,函数声明也不会将函数调用。

  ECMAScript预编译是以一个脚本文件为块的预编译.一个脚本文件进行一次预编译,而不是全文编译完成再进行”预编译”的.变量声明的提升是以变量所处的第一层词法作用域为“单位”的,即全局作用域中声明的变量会提升至全局最顶层,函数内声明的变量只会提升至该函数作用域最顶层。注:ECMAScript函数中不存在块元素的作用域.

2.变量的提升声明 

  使用var声明的变量与未用var声明的变量存在较大的区别.

  1>当声明一个JavaScript全局变量时,实际上是定义了全局对象的一个属性.使用var定义的变量时,创建是全局变量的不可配置的属性,而未在严格模式下给未用var声明的变量赋值时,JavaScript会自动给该变量创建为全局变量,但该变量是全局对象的可配置的属性.

       注:可配置属性即可以通过delete运算符删除,而不可配置属性则无法使用该运算符删除.

  2>使用var定义的变量可以声明提升,未用var声明的变量则不会声明提升.

 

 

 

3.函数的提升声明

  JavaScript中定义函数的两种方法,分别是函数声明和函数表达式.两种方式的定义形式和使用方法存在诸多不同之处.

  1>函数表达式定义的函数只能够在定义完成之后,再去调用,不可以在定义代码之前去调用函数,否则会报错.

  2>函数声明定义的函数可以在函数声明代码之前就调用,也可以在后面调用.

  3>ECMAScript中不存在传统意义上的函数的重载.

    Java其他语言编写函数时可以通过形参定义的签名(接受的参数的类型和数量的不同),通过输入参数的类型和数量的不同,编译器引擎自动来实时调用对应的函数.

    ECMAScript函数函数没有签名,其参数是由零或多个值的数组来表示.因此ECMAScript函数无法有真正意义上的函数重载操作.

函数名不同的情况

  

   

函数名相同的情况

 

 

4.变量与函数混合的提升声明

   在函数和变量同名的时候,JavaScript引擎会将函数声明覆盖变量以及变量函数表达式.

 

 

 

 

 

posted @ 2019-08-24 17:01  Scok  阅读(120)  评论(0编辑  收藏  举报