javascript 声明前置与作用域 ( hoisting& Scoping)

1.javascript不管是变量(or 叫变量表达式?或许变量的声明与赋值吧 var scope=”loacal”)的声明照样函数(or 函数表达式)的声明,都遵照定名在当前作用域前置(提升到当前定名空间顶端)函数体保留在原地。

var scope='global';//全局变量
function text(){
    console.log(scope);//输出为undefined
    var scope='local';
    console.log(scope);//输出为local
}
text();

而上面的代码等价于

var scope;
scope="global"
function text(){
   var scope;         //定名前置
   console.log(scope);//输出为undefined
   scope='local';
   console.log(scope);//输出为local
}
text();

换成函数

text1();
function text1(){//函数的声明
    alert(1);//弹出1
}
text2();
var text2=function(){//函数表达式
    alert(1);//undefined is not a function
}
//上面的函数表达式声明等价于
var text3;//声明前置
text3();
text3=function(){//函数体留在原地
    alert(1);
}

2.javascript只要函数级作用域没有块级作用域。

var name='golbar';
if(true){
    var name='local';
    console.log(name);//输出local
}
console.log(name);//也输出local

假如存在块级作用域那末第一个值为local第二个值为golbar。
块级作用域指的是能用for if while 等代码块构成的自力作用域,即为块级作用域。
特别注意的是不必var 声明的变量那末他归window一切也就是全局作用域一切。
每次援用一个变量,JavaScript 会向上遍历全部作用域直到找到这个变量为止。假如抵达全局作用域然则这个变量仍未找到,则会抛出 ReferenceError 非常。

function text(){
    log="in function";
    console.log(log);
};
text();
console.log(window.log)//都输出为 in function

另有个就是作用域链:一个函数体重嵌套了多层函数体,并在差别的函数体中定义了同一个变量,当个中一个函数接见这个变量时,变会构成一条作用域链 scope chain

chain='window';
function one(){
    var chain='one';
    function two(){
        var chain='two';
        console.log(chain);
    };
    function three(){
        console.log(chain);
    };
    two();
    three();
};
one();             //two one 
console.log(chain);// window

作用域链有个特殊情况就是with语句:JS中的with语句重要用来暂时扩大作用域链,将语句中的对象添加到作用域的头部。with语句完毕后,作用域链恢复一般。

chain='window';
function one(){
    var chain='one';
     function two(obj){
         console.log(chain);//输出为one
         with(obj){
         console.log(chain)//输出为obj
         }
     }
     var obj={chain:'obj'};
     two(obj);
}
one();   

另有就是编写代码的时刻虽然JS能够不必;或许相直接 if(true) return; 但只管不要如许写。至于为何的话今后会写。

    原文作者:lx_blog
    原文地址: https://segmentfault.com/a/1190000007853545
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞