<html>
<body>
<script type="text/javascript"> function a(){
alert("a1");
}
a(); function a(){
alert("a2");
}
a();
</script></body></html>
<body>
<script type="text/javascript"> function a(){
alert("a1");
}
a(); function a(){
alert("a2");
}
a();
</script></body></html>
第二个function a()会不会覆盖第一个function a()
???
难道和java的重写一个原理?
<html>
<body>
<script type="text/javascript"> var a= function (){
alert("a1");
}
a(); var a= function (){
alert("a2");
}
a();
</script></body></html>
做了一个小小的改动,这样对比就明显了
alert("a1");
}
a(); var a = function(){
alert("a2");
}
a();
改下面的就可以
函数执行的时候,是在global 作用域里的。执行到a函数的时候,只找最后定义的那个来执行
var a = 123;
function f() {
alert(a);//在f函数的作用域,找a,如果找不到,才到f函数外面找
var a = 1;
alert(a);
}
f();
猜测输出什么
js先执行function的定义,再执行js代码
<body>
<script type="text/javascript">
var a = 123;
function f() {
alert(a); //这个怎么变成undefine??为什么不去自动寻找外边的 a????
var a = 1;
alert(a);
}
f();
</script>
</body>
</html>
里面有了,所以没去外面找啊,但是里面虽然有了,却是在第一个alert 底下才定义的,所以输出undefine啦..
http://www.cnblogs.com/kym/archive/2010/01/06/1640043.html
代码:var a = 1;
d();
e();
var b = 2;
var c = 3;
function d(){
alert(a);
var a = 0;
alert(a);
}
function e(){
alert(b);
}
var b;
var c;
function d(){};
function e(){};
a=1;
d();
var a;
alert(a);//undefined,如果没有d函数中的var a=0,这个地方就是1
a = 0;
alert(a);//0
e();
alert(b);//undefined,js会从e域往上层域找,直到window为止,只要其中任何一个域中有b的定义,就会作为参数传递给alert,哪怕是undefined
a=1;
b=2;
c=3;
函数定义先于其它的代码,后面的函数a会取代前面的已定义的。
a();//这里依然能够调到a方法
function a(){
alert(1);
}
</script>由此你应该明白为什么了吧
function优先
alert("a1");
}
a();var a = function (){
alert("a2");
}
a();
<Script>
a();
a = function(){alert("去shi!");}
a();
function a(){alert("sb1");}
a();
function a(){alert("sb2");}
a();
</script>
</html>
我执行这个,为什么是"sb2",然后3个"去shi!",不是应该"去shi!",然后三个"sb2"吗?我的理解是这样的,js引擎先扫描编译一下js代码,第一句是赋值a方法,后面两函数因为相同,则认为最后一个有效。请指出我哪里理解错了,谢谢
a1
a2
变量和函数的定义是全局的。
这涉及到JavaScript的语法本身,
在Javascript中函数也是一种对象,因此
定义函数有两种形式:1,定义式,function foo(){}
2,声明式,var foo = function(){}
在执行时,对于声明式来说按正常的语句顺序执行。
但对于定义式来说,JS引擎会提出出来,预先处理,因此,重复定义函数,后面的会覆盖前面的。参见 李战的《javascript真经》,哈哈。
//正常
a();
a();
function a(){
alert("a1");
}
function a(){
alert("a2");
}//报错,缺少对象
a();
a();
a = function(){
alert("a1");
}
a = function(){
alert("a2");
}
<html>
<body>
<script type="text/javascript">
a();
function a(){
alert("a1");
}
a(); function a(){
alert("a2");
}
a();
</script></body></html>
还是三个a2
在词法分析结束后,构造作用域链的时候,会将函数内定义的var变量放入该链,因此a在整个函数f()内都是可见的(从函数体的第一行到最后一行),
因为js执行,会先便利一遍所有的function,第二个把第一个给覆盖了,所以两次a2
almost equivalent. This hedging is due to one major difference in the way that an interpreter loads data
into the execution context. Function declarations are read and available in an execution context before
any code is executed, whereas function expressions aren ’ t complete until the execution reaches that line
of code
与
function a() {}
的唯一区别就是后者会在其作用域中预先定义a();
function a() {};
正常运行a();
var a = function() {};
报错:变量未定义
a2
a2JS无函数重载机制,作用域和预解析是另一个话题