JavaScript语法规范中,在变量声明时,变量所在的作用域空间,会将变量的声明提升到所有代码的前面,就是语法规范中的变量预解析,防止代码出现语法错误
--语法规范中,针对函数也有预解析的操作,如果函数的声明方式是表达式声明语法,预解析过程和变量的预解析过程一致;如果是函数的标准声明方式,函数所在的作用域空间会将函数的完整声明提升到作用域空间所有代码的最前面,保障函数在该作用域中的正常执行
JS语法规范中,对于函数的预解析,和函数的声明方式有关
如果表达式方式声明的函数,预解析方式和变量一致,函数声明之前,函数名称中存储的数据是undefined
如果标准方式声明的函数,JS语法规范中会将整个函数进行预解析,函数名称中存储的是整个函数的声明
1、未声明直接使用------报错
2、先使用后使用---------undefined
预解析分为
变量预解析--变量提升
函数预解析--函数提升
代码示例:
fn1()
console.log(c)
console.log(b)
console.log(a)
function fn1(){
var a=b=c=9
console.log(a)
console.log(b)
console.log(c)
}
输出结果:9,9,报错,9,9,9
var a=b=c=9相当于vara=9;b=9;c=9
a,在函数内部声明的变量,只能适用于函数内部,属于局部变量
b,c在函数内部没有声明直接赋值,这种相当于全局变量在函数外部也可以使用
所以,在函数内部a,b,c都打印结果为9,函数外部b,c打印结果也是9,但a是局部变量在函数外部未声明,所以为报错
注:
全局变量:函数内部未声明的变量以及在在 函数外部声明的变量-只有在浏览器关闭时才会销毁,会占用内存
局部变量:形参以及在某一个函数内部声明的变量 -在项目关闭时就会进行销毁,节省资源并节省内存空间