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
97 声望12 粉丝

geek