变量和函数提升

聊聊变量和函数的提升,按照自己的理解通俗的说出来。

  • 变量的提升

1     console.log(num); //输出undefined
2     var num = 1;
3     //等价于
4     var num;
5     console.log(num); //输出undefined
6     num = 1;

变量提升好理解,javascript在执行代码的时候会首先把页面声明的全局变量提升到最前面,但是值没有提升,只是把申明放在了前面,所以输出了undefined

  • 函数的提升

 1     test()
 2     function test(){
 3         console.log("test function");
 4     }
 5     //---------------------我是分割线--------------------------------------
 6     //等价于
 7     function test(){
 8         console.log("test function");
 9     }
10     test()

申明了函数后无论在哪都能被调用,这是因为函数被整体提升到了前面去了,这与变量提升有些不同,变量只是申明被提升到了前面,而函数是整体被提升到了前面。

  • 碰到的坑

1     var test = function(){
2         console.log("test");
3     }
4     function test(){
5         console.log("test function");
6     }
7     test();//输出 test
1     function test(){
2         console.log("test function");
3     }
4     var test = function(){
5         console.log("test");
6     }
7     test();//还是输出 test

WTF?两次都是输出test,我开始也是一脸萌比了。其实了解后才恍然大悟。

  • 第一种情况提升后

 1     var test //我被提升了
 2     function test(){
 3         console.log("test function");  //我也被提升到这里来了哈哈
 4     }
 5     //---------------------上面是提升区-----------------------------------
 6         test = function(){
 7         console.log("test");
 8     }
 9     // function test(){
10     //     console.log("test function");  //我被提升到上面去了
11     // }
12         test();//输出 test

只要申明了变量和定义函数开始都会被按照顺序提升到最前面,然后按照顺序执行代码,首先输出 test function 然后被test覆盖了,所以最后输出了test

  • 第二种情况提升后

 1     function test(){
 2         console.log("test function");  //我被提升到上面去了
 3     }
 4     var test;
 5     //---------------------上面是提升区-----------------------------------
 6     // function test(){
 7     //     console.log("test function");  //我被提升到上面去了
 8     // }
 9     test = function(){     //我的申明被提升了
10         console.log("test");
11     }
12     test();//还是输出 test

提升后按照顺序执行,发现test function还是被test覆盖了,最后还是输出了test

  • 最后一种情况提升前

1     test(); //输出test function
2     function test(){
3         console.log("test function");  
4     }
5     var test = function(){     
6         console.log("test");
7     }
  • 提升后

 1     function test(){
 2         console.log("test function");  
 3     }
 4     var test;
 5     //---------------------上面是提升区-----------------------------------
 6     test(); //输出test function
 7     // function test(){
 8     //     console.log("test function");  //我被全部提升到上面去了
 9     // }
10         test = function(){     
11         console.log("test");
12     }

这个第6行调用输出 test function 。为什么是这个结果呢?代码按照顺序执行,第四行虽然声明提上来了,但是没有值,第六行就已经输出来了,不存在覆盖的情况。直接输出了test function。

原文地址:https://www.cnblogs.com/yewenxiang/p/6185016.html