函数作用域
在C语言中,定义一个变量的作用域仅属于这个花括号内,即该变量在夸括号外是不可见的,我们称之为块级作用域。而JavaScript中没用“块级作用域”,而是“函数作用域”。顾名思义,以此类推:变量在声明他们的函数体内以及这个函数体嵌套的函数体内都是有定义的。
实例:
function test(obj) //obj表示一个对象
{
var i=obj; //i在整个函数体内均有定义
for(typeof i == "object")
{
var j=0; //j在整个函数体内均有定义
for(var k=0;k<10;k++) //k在整个函数体内均有定义
{
console.log(k); //输出0~9
}
console.log(k); //输出10
}
console.log(j); //j有定义,但可能没有初始化
}
JS中的函数作用域意味着变量在声明之前可用,这个特性被称为“声明提前”,即JS函数里声明的所有变量(不涉及赋值)都被“提前”至函数体的顶部。“声明提前”是在JS引擎的“预编译”时进行的。
声明提前
实例:
var scope="gloval";
function f() {
console.log(scope); //"undefined"
var scope="local";
console.log(scope);//"local"
}
第一行输出“undefined”,因为申明提前,函数体内定义的scope覆盖了全局的scope