javascript深入理解系列——(七)变量提升,函数提升,区块

javascript深入理解系列文章网址
https://www.jianshu.com/p/451eed9094f5

在理解这些之前我们先讲一下变量提升的概念,和区块的运行方式,有助于后面的理解

变量提升

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量(这里注意只是变量名,没有赋值),然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

console.log(a);
    var a=6;

比如我们写上面的这些代码,javascript会怎么运行呢?

var a;
console.log(a);
a=1;

会输出undefined,因为还没有赋值

区块

JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。

常见的区块有if,for,while,switch,function,和其他强类型语言的区别是,除了function,对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。就是说加{}和不加没有区别。

if(true){
        var i=0;
    }
console.log(i);//输出0
for(var i=0;i<3;i++){
        
}
console.log(i);//输出3

函数名的提升

和变量提升一样,javascript引擎将函数名视为变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,注意这里说的是这个函数被提升到代码头部。
所以

        fn();
        function fn(){
            console.log("111");
        }

会变成

function fn(){
            console.log("111");
        }
 fn();

所以这种情况是不会报错的

但是如果采用赋值语句定义函数,JavaScript 就会报错。

        fn();
        var fn=function(){
            console.log(1111);
        }

这种形式等同于

       var fn;
        fn();
        fn=function(){
            console.log(1111);
        }

fn变量名被提升至顶部,未赋值为undefined,所以在调用的时候会报错

参考内容 https://wangdoc.com/javascript/types/function.html

你可能感兴趣的:(javascript深入理解系列——(七)变量提升,函数提升,区块)