js的预解析机制
预解析,就是js会将变量声明和函数声明提到当前作用域的最前方
(提升时,应该是 变量声明在前,函数声明在后,这样就可以解释,冲突的时候,是函数有效—第三条)
在碰到script标签,js开始预解析,将全局的用 var 声明的变量和函数的声明提升到 当前作用域最前面
之后就顺序执行,之后遇到局部的,再同理处理
- 只能预解析var声明的变量,没有用var声明的变量(隐式全局变量)不会被预解析
- 函数声明中的没有用var声明而直接赋值的变量,只有在函数调用之后才会生效,成为隐式全局变量
- 在函数名和var变量名冲突的时候,预解析会舍弃var变量的声明(原因也是后来者有效)
- 函数名和函数名冲突的时候,(声明)后来者有效
- 预解析是分标签的
- 在使用函数表达式的时候,提升的是var变量,而不是函数声明
- 在变量赋值后,同名的函数名失效,无法调用函数
- 提升只限当前作用域
/*
* 预解析,就是js会将变量声明和函数声明提到当前作用域的最前方
* 在碰到<script>标签,js开始预解析,将全局的用 var 声明的变量和函数的声明提升到最前面
* 之后就顺序执行,之后遇到局部的,再同理处理
* 1. 只能预解析var声明的变量,没有用var声明的变量(隐式全局变量)不会被预解析
* 2. 函数声明中的没有用var声明而直接幅值的变量,只有在函数调用之后才会生效,成为隐式全局变量
* 3. 在函数名和var变量名冲突的时候,预解析会舍弃var变量的声明
* 4. 函数名和函数名冲突的时候,(声明)后来者有效
* 5. 预解析是分标签的
* 6. 在使用函数表达式的时候,提升的是var变量,而不是函数声明
* 7. 在变量赋值后,同名的函数名失效,无法调用函数
* 8. 提升只限当前作用域
* */
console.log(a());//3 99
console.log(a);//ƒ a() {// 函数调用后,隐式全局变量生效 b = 2;console.log(3);return 99;}
var a = 10;
a = function (){
console.log(33);
}
console.log(a());//33 undefined
// 不会被调用
function a() {
b = 1;
console.log(2);
return 88;
}
console.log(b);//2
console.log(a);//ƒ (){console.log(33);}
function a() {
// 函数调用后,隐式全局变量生效
b = 2;
console.log(3);
return 99;
}
// b = 3;
var a = 11;
console.log(a);//11