估计楼上的都没动手试一下,结果确是如楼主所说:没有被覆盖。这个问题来源于js的执行原理: 在页面中,(除去在html元素中直接添加的)js代码的放置无非就两种情形://情形a <script type="text/javascript" src="xxx.js"></script> //情形b <script type="text/javascript"> code...... </script>(1)a中的js文件或b中的js代码块都是js代码段,引入一个js文件就是一个代码段,同样一个script闭合标签夹着一堆js代码也是一个代码段。一般页面中常常会有多个代码段,既有js文件,也有块式的,当页面载入时:这些代码段是按照自上而下的顺序执行的。也就是说,执行完了一个代码段才会执行下面第二个代码段。 (2)每个代码段的执行顺序是相同的: 检查语法-->预解析-->最后执行 楼主的问题就在于: 当你把js代码全都放在一个代码段中的时候,f1被覆盖不难理解。 当把js代码分成两个文件,也就是分成两个代码段: 第一个代码段: function a(){alert(1);} var f1=a;第一个代码段: function a(){alert(2);} var f2=a;此时,第一个代码段因为在给f1赋值a的时候只在当前的全局环境中中找到了“function a(){alert(1);}”,所以f1就是函数“function a(){alert(1);}”。 第二段代码,因为又声明了一个同名函数a所以全局中之前的函数a被覆盖,所以f2在赋值的时候是新的a函数“function a(){alert(2);}”。 因为变量f1已经在代码段1中完成赋值,段2中并无任何对f1的操作,所以除非在第二段代码中加入:“var f1=...”,否则f1的值是不变的。而如果所有的代码放在一起(同一个代码段)的话,因为在预解析的阶段“function a(){alert(2);}”会把“function a(){alert(1);}”覆盖,所以在给f1赋值a的时候,当前的全局环境中a已经是“function a(){alert(2);}”。
还真没是过。 原来这样是不一样的 <script> function a(){ alert(1); } var $f1=a; </script> <script> function a(){ alert(2); } var $f2=a; </script><script > $f1();</script>
#7 正解!<script> function a(){ alert(1); } var f1=a;//保存a //代码段1结束 //代码段2开始 function a(){ alert(2); } var f2=a;//保存a //代码段2结束
window.onload=function(){ f1(); } </script>输出 2 而<script> function a(){ alert(1); } var f1=a;//保存a //代码段1结束 </script> <script> //代码段2开始 function a(){ alert(2); } var f2=a;//保存a //代码段2结束
window.onload=function(){ f1(); } </script>输出 1
函数是被被覆盖了,因为 a() 时输出的是 2 但作为第一段的函数 a 的载体 f1 并没有人去覆盖它 所以从这个意义上说, #7 的解释又是错误的
在chrome和IE function在所有执行代码前先编译
http://blog.csdn.net/hch126163/article/details/6022557
在页面中,(除去在html元素中直接添加的)js代码的放置无非就两种情形://情形a
<script type="text/javascript" src="xxx.js"></script>
//情形b
<script type="text/javascript">
code......
</script>(1)a中的js文件或b中的js代码块都是js代码段,引入一个js文件就是一个代码段,同样一个script闭合标签夹着一堆js代码也是一个代码段。一般页面中常常会有多个代码段,既有js文件,也有块式的,当页面载入时:这些代码段是按照自上而下的顺序执行的。也就是说,执行完了一个代码段才会执行下面第二个代码段。
(2)每个代码段的执行顺序是相同的:
检查语法-->预解析-->最后执行
楼主的问题就在于:
当你把js代码全都放在一个代码段中的时候,f1被覆盖不难理解。
当把js代码分成两个文件,也就是分成两个代码段:
第一个代码段: function a(){alert(1);}
var f1=a;第一个代码段: function a(){alert(2);}
var f2=a;此时,第一个代码段因为在给f1赋值a的时候只在当前的全局环境中中找到了“function a(){alert(1);}”,所以f1就是函数“function a(){alert(1);}”。
第二段代码,因为又声明了一个同名函数a所以全局中之前的函数a被覆盖,所以f2在赋值的时候是新的a函数“function a(){alert(2);}”。
因为变量f1已经在代码段1中完成赋值,段2中并无任何对f1的操作,所以除非在第二段代码中加入:“var f1=...”,否则f1的值是不变的。而如果所有的代码放在一起(同一个代码段)的话,因为在预解析的阶段“function a(){alert(2);}”会把“function a(){alert(1);}”覆盖,所以在给f1赋值a的时候,当前的全局环境中a已经是“function a(){alert(2);}”。
原来这样是不一样的
<script>
function a(){
alert(1);
}
var $f1=a;
</script>
<script>
function a(){
alert(2);
}
var $f2=a;
</script><script >
$f1();</script>
function a(){
alert(1);
}
var f1=a;//保存a
//代码段1结束
//代码段2开始
function a(){
alert(2);
}
var f2=a;//保存a
//代码段2结束
window.onload=function(){
f1();
}
</script>输出 2
而<script>
function a(){
alert(1);
}
var f1=a;//保存a
//代码段1结束
</script>
<script>
//代码段2开始
function a(){
alert(2);
}
var f2=a;//保存a
//代码段2结束
window.onload=function(){
f1();
}
</script>输出 1
但作为第一段的函数 a 的载体 f1 并没有人去覆盖它
所以从这个意义上说, #7 的解释又是错误的