js的预解析机制

js的预解析机制


预解析,就是js会将变量声明和函数声明提到当前作用域的最前方
(提升时,应该是 变量声明在前,函数声明在后,这样就可以解释,冲突的时候,是函数有效—第三条)
在碰到script标签,js开始预解析,将全局的用 var 声明的变量和函数的声明提升到 当前作用域最前面
之后就顺序执行,之后遇到局部的,再同理处理

  1. 只能预解析var声明的变量,没有用var声明的变量(隐式全局变量)不会被预解析
  2. 函数声明中的没有用var声明而直接赋值的变量,只有在函数调用之后才会生效,成为隐式全局变量
  3. 在函数名和var变量名冲突的时候,预解析会舍弃var变量的声明(原因也是后来者有效)
  4. 函数名和函数名冲突的时候,(声明)后来者有效
  5. 预解析是分标签的
  6. 在使用函数表达式的时候,提升的是var变量,而不是函数声明
  7. 在变量赋值后,同名的函数名失效,无法调用函数
  8. 提升只限当前作用域
/*
* 预解析,就是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

猜你喜欢

转载自blog.csdn.net/ckxkobe/article/details/84638190