什么是块级作用域呢?
任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
函数作用域就好理解了,定义在函数中的参数和变量在函数外部是不可见的。大多数类C语言都拥有块级作用域,JS却没有。
var scope="global";
function t(){
console.log(scope);
var scope="local"
console.log(scope);
}
t();
第一句输出的是: "undefined",而不是 "global"
第二讲输出的是:"local"
这个例子等效于: var scope="global";
function t(){
var scope;
console.log(scope);
scope="local"
console.log(scope);
}
t();
总结:函数内部定义的变量,在函数内部处处可见。。(很重要)
例子2:
name="lwy";
function t(){
var name="tlwy";
function s(){
var name="slwy";
console.log(name);
}
function ss(){
console.log(name);
}
s();
ss();
}
输出:"slwy" "tlwy"
可以结合理解:函数内部定义的变量,在函数内部处处可见。。
例子3:
var scope="global";
function t(){
alert(scope);
var scope="local"
alert(scope);
}
输出的是:unfind, local
var scope="global";
function t(){
alert(scope);
}
输出:global
以上两个例子说明:函数内部定义的变量,在函数内部处处可见(并且没有先后顺序)。因此在例子3中的第一个方法中函数内部的变量会覆盖全局变量。还没执行得到赋值,所以会输出unfind。
例子4:
function t(flag){
if(flag){
s="ifscope";
for(var i=0;i<2;i++)
;
}
console.log(i);
}
t(true);
console.log(s);
还是输出:2,ifscope
函数内部定义变量时:如例子 s="ifscope"; 如果s前没有修饰var,则定义的是全局变量。所以例子会输出ifscope.
一个特殊点:
with语句
说到作用域链,不得不说with语句。with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部。
看下面代码 person={name:"yhb",age:22,height:175,wife:{name:"lwy",age:21}};
with(person.wife){
console.log(name);
}
with语句的特殊用法:虽然name在{}中,但是with语句将person.wife添加到当前作用域链的头部,会输出的就是:“lwy".
with语句结束后,作用域链恢复正常。(这就是with语句的特殊性)
总结:**********
函数内部定义的变量,在函数内部处处可见。。
函数内部定义变量时:如果变量前面没有修饰var,则定义的是全局变量。