js函数预处理


  函数的预处理阶段

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函数预处理

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值