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; 但尽量不要这样写。至于为什么的话以后会写。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。