函数的作用域和预解析问题

一、函数的作用域的访问规则是向上查找的:

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);

 

posted @ 2017-04-24 18:35  前端扛把子  阅读(160)  评论(0编辑  收藏  举报