函数的预处理阶段
1.同样函数是最高级别
2.每调用一次,产生一个LexicalEnvironment
3.内部声明式函数
4.内部var变量
5.冲突情况与全局处理一样
6.先函数的参数
6.1 一些语言提供的对象,比如arguments等
6.2 参数有传,那么就有值,没有就是undefined
6.3 如果多个函数参数名字一样,那么最后一个的优先级最高
函数执行阶段
1.给预处理阶段的成员赋值
2.如果没有用var声明的变量,会成为最外部LexicalEnvironment的成员
首先
同样函数是最高级别,在预处理中这一点是永恒不变的。
内部声明式函数和内部var变量 说白了就是作用域的不同 和预处理没有什么不同。
举例说明
<script type="text/javascript">
function fn(a,b){
alert(arguments[0])//1
alert(a);//1
alert(b);//2
alert(fn1);//function fn1(){ console.log(i) }
alert(i);//undefined
var i = 1;
i++;
function fn1(){
console.log(i)
}
};
fn(1,2);
</script>
fn1 还是弹出的函数体 i 还是undefined吧。这里和预处理并没有什么不同。
特殊就特殊在 先函数的参数。在函数内部预处理阶段,函数的参数加载出来了。证明了参数比函数内部
预处理还要先处理吧。 首先它会加载arguments语言提供的对象
这个好解释,难就难在冲突。再看下面一个例子 变量冲突
<script type="text/javascript">
function fn(a,b,a){
alert(arguments[0])//1
alert(a);//3
alert(b);//2
alert(fn1);//function fn1(){ console.log(i) }
alert(i);//undefined
var i = 1;
i++;
function fn1(){
console.log(i)
}
};
fn(1,2,3);
</script>
这个例子证明了 6.3那句话
如果多个函数参数名字一样,那么最后一个的优先级最高
那么问题来了,为什么会是最后一个a 而不是第一个a呢?
这就和arguments内部引用有关系
http://blog.csdn.net/admin9527_/article/details/78316982
这篇博客讲述了arguments内部引用,和特殊实例。 如果不理解的请仔细阅读js预处理和js函数预处理