js变量提升&声明变量带var和不带var的区别

冷不防 2023-02-21 06:25 112阅读 0赞

变量提升:当栈内存(作用域)形成,JS代码自上而下执行之前浏览器首先会把所有带“VAR / FUNCTION”
关键字的进行前的 “声明”和“定义”这种预先处理机制称之为“变量提升”。

变量声明(declare):var a =12;function sum(){};
使用变量步骤:a.声明–>b.赋值–>3.调用

  1. <script type="text/javascript">
  2. var a; //声明
  3. a=10; //赋值
  4. console.log(a); //输出10 调用;
  5. function sum(){ //声明赋值
  6. console.log(0)
  7. }
  8. sum(); //输出0 调用
  9. </script>

【变量提升阶段】
1、带“VAR”的是只声明未定义
2、带“FUNCTION”的声明和赋值都完成
3、变量提升只发生在当前作用域(例如:开始加载页面的时候只对全局作用域下的进行提升 ,因为此时函数中储存的都是字符串而已)
4、全局作用域下声明的函数或者变量是“全局变量”同理,在私有作用域下声明的变量是“私有变量”。
【带VAR 和FUNCTION 的才是声明】
浏览器做过的事情不会重复第二遍,也就是,当代码执行遇到创建函数这部分代码后,直接的跳过即可(因为在提升阶段就已经完成函数的赋值操作了)
带var和不带var的区别
在全局作用域下声明一个变量,也相当于给window全局对象设置了一个属性,变量的值就是属性值(私有作用域中声明的私有变量和window没啥关系)
在变量提升阶段,在全局作用域中声明了一个变量A,此时就已经把A当做属性赋值给window了只不过此时还没有给A赋值,默认值undefined, in检测某个属性是否属于这个对象。
例如:

  1. <script>
  2. console.loga,b //=>输出 undefind undefeind
  3. var a=12,
  4. b=12;
  5. function fn(){
  6. console.log(a,b) //=> 输出 undefind 12
  7. var a=b=13;
  8. // 执行过程相当于 var a=13 ; b=13
  9. console.log(a,b) //=》输出 13 13
  10. }
  11. fn();
  12. console.log(a,b) //=> 输出12 13
  13. </script>

私有作用域带var和不带var也有区别

1、带var的私有作用域变量提升阶段,都声明为私有变量,和外界没有任何关系。
2、不带var不是私有变量,会向它的上级作用域查找,看是否为上级的变量,不是继续向上查找,一直找到window为止(我们把这种查找机制叫做:作用域链),也就是我们在私有作用域中操作的这个非私有变量,一直是别人的变量。

发表评论

表情:
评论列表 (有 0 条评论,112人围观)

还没有评论,来说两句吧...

相关阅读