变量作用域
一个变量的作用域(scope)是成语源代码中定义这个变量的区域。全局变量拥有全局作用域。在js中任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。他们是局部变量,作用域时局部性的,函数参数也是局部变量,他们只在函数体内有定义。
在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内生明一个局部变量或者函数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。
var scope = "global"; //声明一个全局变量
function checkscope(){
var scope = "local"; //声明一个同名的局部变量
return scope; //返回局部变量的值,而不是全局变量的值
}
checkscope();
尽管全局作用编写时可以不用 var 语句,但声明局部变量时必须使用 var 语句。
函数作用域和声明提前
js中没有像C语言中的块级作用域(block scope),而使用了函数作用域(function scope);变量在声明他们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
在如下所示的代码中,在不同位置定义了 i、j和k,他们都字啊同一个作用域内——这三个变量在函数体内君是有定义的。
function test(o){
var i = o; //在整个函数体内均有定义
if(typeof 0 =="number"){
var j = o; //j在函数体内是有定义的,不仅仅是在这个代码片段
for(var k = o;k< 10;k++){ //k在函数体内是有定义的,不仅仅是在循环内
console.log(k); //输出数字0~9
}
console.log(k); //k已经定义了输出10
}
console.log(j); //j已经定义了,但可能没有初始化
}
js中的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。这就意味着变量在声明之前已经可用,在js函数中声明的所有变量(但不涉及赋值),都被提前值函数的顶部。如下:
var scope= 'global';
function f(){
consoloe.log(scope); // 输出undefined,而不是global
var scope = 'local'; // 变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
consoloe.log(scope); · // 输出local
}
你可能会认为函数中第一行会输出global,因为代码还没有执行到var语句声明局部变量的地方。其实不然由于函数作用域的特性,局部变量在整个函数体内始终是有定义的。也就是说,在函数体内局部变量遮盖了同名的全局变量。因此只有当程序执行到var语句时,局部变量才会被真正赋值。即等价于如下代码。
function f(){
var scope; //在函数顶部声明局部变量
consoloe.log(scope); // 变量存在,但其值是undefined
scope = 'local'; // 这里将其初始化并赋值
consoloe.log(scope); · // 输出local
}