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; 但只管不要如许写。至于为何的话今后会写。