美文网首页@产品@IT·互联网
javascript深入理解系列——(七)变量提升,函数提升,区

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

作者: 悦者生存 | 来源:发表于2018-09-08 16:22 被阅读65次

    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");
            }
    

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

    但是如果采用赋值语句定义函数,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深入理解系列——(七)变量提升,函数提升,区

        本文链接:https://www.haomeiwen.com/subject/hxhgwftx.html