函数的作用域和预解析问题
一、函数的作用域的访问规则是向上查找的:
1.如果这个函数在函数体内已经有变量的声明了,那么它就不会去外面查找。
比如
var a=10;
function abc()
{
console.log(a);
var a=20;
}
abc();
上面这个函数输出是undefined。因为在函数内它自己有声明了,父函数那个声明就不会去用了。
2.如果这个函数在函数体内没有声明变量,那么它就会去父亲函数里面找,如果父亲函数里有声明变量,那么就直接拿过来用,如果没有,就会去全局变量中查找。
3.如果函数想要直接修改这个变量,但是这个变量又没有在这个函数体内有声明,那么就会去父亲函数里面找,如果父亲函数里面有声明,就会直接修改父亲函数声明的那个变量的值。
二、预解析
1.函数在声明变量的时候,会把变量的声明提前到作用域前(先声明不赋值),赋值语句还留在原地。
2.函数声明的时候,会把函数的声明代码提前到作用域的最顶端。
abc();
console.log(a);
console.log(b);
console.log(c);
function abc()
{
console.log(a);
var a=b=c=10;
}
上面的结果
首先是函数的代码会提前到作用域前,那么会被放到javascript标签内,所以预解析之后的代码:
function abc()
{
console.log(a);
var a=b=c=10;//这里等价与 b=10;c=10;var a=10;所以b和c是全局变量,a是局部变量
}
abc();
console.log(a);
console.log(b);
console.log(c);