Javascript变量提升和函数提升

2018-04-03  本文已影响0人  肆意咯咯咯

Javascript引擎的工作方式是:先解析代码,获取所有被声明的变量,然后再一行一行的运行。

一.变量提升
在Es6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域,变量提升即将变量声明提升到它所在作用域的最开始的部分。
首先举一个简单的例子:
console.log(b);//undefined
var b =1;
console.log(b);//1

首先使用console.log方法在控制台显示变量b。这个时候变量B还没有声明和赋值,但不会报错,因为存在变量提升,先将变量B的声明提升到了最开始的地方;

var b;
console.log(b);//undefined
b =1;
console.log(b);//1
举例二:
var a = 5;
            function foo(){
                a = 2;
                console.log(a);
                var a;
            }
            foo();//2

在函数内解析编译时,“var a”因为变量提升被提前了,所以我们看到的是内部变量a,而不是外面已经赋值的外部变量5;

举例三:
var a=5;
            function foo(){
                console.log(a);
                var a = 2;
            }
            foo();//undefined
二.函数提升
js创建函数存在两种方式:函数声明和函数表达式,只有函数声明存在函数提升;
//函数声明
function myTest(){
                foo();
                function foo(){
                    alert("我来自foo");
                }
            }
            myTest();//我来自foo
//函数表达式
function myTest(){
                foo();
                var foo = function(){
                    alert("我来自foo");
                }
            }
            myTest();//TypeError:foo is not a function;

总结:关于变量提升和函数提升的问题大概就这些,可以多做一些练习;

(function() {  
                console.log(a);    //undefined  
                a = 'aaa';  
                var a = 'bbb';  
                console.log(a);    //'bbb'
            })();
console.log(f1()); //undefined
            console.log(f2);   //undefined
            function f1() {console.log('aa')}  //aa
            var f2 = function() {}
上一篇 下一篇

猜你喜欢

热点阅读