JavaScript的作用域是指变量的作用范围,内部作用域由函数的形参,实参,局部变量,函数构成。
内部作用域和外部的作用域一层层的链接起来形成作用域链。
当在函数内部要访问一个变量的时候,首先要查找自己的内部作用域有没有这个变量,如果没有就到这个对象的原型对象中去查看,还是没用的话,就到该作用域所在的作用域中找,直到到Window所在的作用域,每个函数在声明的时候就默认有一个外部作用域的存在了,例如:
var t = 4;
function foo() {
var tem = 12;
function bar() {
var temo = 34;
console.log(t + " " + tem + " " + temo);
}
return bar();
}
foo();
//输出的结果:4 12 34
JavaScript变量提升
var bar=1;
function test(){
console.log(bar); //undeifned
var bar=2;
console.log(bar); //2
}
test();
为什么在test函数中会出现上述结果呢,这就是JavaScript的变量提升了,虽然变量bar的定义在后面,不过浏览器在解析的时候,会把变量的定义放到最前面,上面的test函数相当于
function test(){
var bar;
console.log(bar); //undefined
bar=2;
console.log(bar); //2
}
再看
var foo=function(){ console.log(1); }
function foo(){ console.log(2); }
foo(); //结果为1
//同样的,函数的定义也会到提升到最前面,上面的代码相当于
function foo(){ console.log(2); }
var foo;
foo=funciton(){ console.log(1); }
foo(); //1