Javascript 变量执行过程 和 数组 & 对象的区别

变量提升

var f = 1;
function bar(){
    f = 10;
    function f(){

    }
}
bar();
alert(f);
顺序:1、提升bar,提升f
      2、f = 1
      3、bar函数执行,创建闭包
         3.1、提升函数f
         3.2、给函数f赋值了10
         3.3、函数执行完毕,闭包空间销毁
      4、alert(f) 弹出1

JS执行过程
1. 先提升(先提升函数,再提升变量,如果名字一样,变量提升会覆盖函数提升)
2. 再执行,如果遇到闭包创建
3. 在闭包空间中反复1和2
4. 先定义(提升),在执行
5. 变量提升
6. 函数提升

问题提出

function change() {
  alert(typeof fn);
  function fn() {
    
  }
  var fn
}
change()

为什么不是undefined?

在js中函数的声明 比变量优先级要高
并且定义过程不会被变量覆盖 除非是赋值

你的代码相当于

function change() {
   function fn(){}
   var fn;
   alert(typeof fn) // function 不会被覆盖
   fn=1;
   alert(typeof fn) // 1   会覆盖
}
change()

数组和对象的区别

var arr = [ , , , ,  ,];
var obj = {
   xxx :xxx,
   xxx :xxx
}

注意 obj.xxxobj[xxx] 的区别

第一种是规定obj必须得有那个属性,不可改变
第二种可以动态添加属性,通过字符串的方式

推荐阅读更多精彩内容