作用域
变量作用域
一个变量的作用域是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在javascript代码中的任何地方都有定义。然而在函数内声明的变量只在函数体内有定义。它们是局部变量,作用域是局部性的。函数参数也是局部变量,它们只在函数体内有定义。在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量遮盖。
函数作用域和声明提前
javascript使用了函数作用域:变量在声明他们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
在如下代码中,在不同位置定义了i、j和k,它们都在同一个作用域内--这三个变量在函数体内均是有定义的。
function(o){
var i=0;
if(typeof o =="object"){
var j=0;
for(var k=0;k<10;k++){
console.log(k);
}
console.log(k);
}
console.log(j);
}
javascript的函数作用域是指在函数内声明的所有变量在函数体内始终可见。这意味着变量在声明之前甚至可用。javascript的这个特性被非正式的成为声明提前,即javascript函数里声明的所有变量(但不涉及赋值)都被“提前”至函数体的顶部。
var scope="global";
function f(){
console.log(scope); //输出"undefined",而不是"global"
var scope = "local"; //变量在这赋初始值,但变量本身在函数体内任何地方均是有定义的
console.log(scope); //输出"local"
}
你可能会误以为函数中的第一行会输出"global",因为代码还没执行到var 语句声明局部变量的地方。其实不然,由于函数作用域的特性,局部变量在整个函数体始终是有定义的。也就是说,在函数体内部变量遮盖了同名全局变量。尽管如此,只有在程序执行到var语句的时候,局部变量才被真正的赋值。因此,上述过程等价于:将函数内的变量声明“提前”至函数体的顶部,同时变量初始化留在原来的位置。