晕了,谁给解释一下这四小段代码

连山秀举 2011-09-05 09:07:43
我的环境是Firefox6.0
其实第一,第三,第四段代码都好理解,关键解释下第2段
<script>
/*
func1();
var function func1(){
alert(1);
}
//正常弹出
*/

func1();
var testfun=function func1(){
alert(1);
}
//不弹出,Firebug:func1() is not defined
/*
testfun();
var testfun=function func1(){
alert(1);
}
//Firebug:testfun() is not a function
*/

/*
testfun();
var testfun=function(){
alert(1);
}
//Firebug:testfun() is not a function
*/
</script>
...全文
100 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Exodia 2011-09-05
  • 打赏
  • 举报
回复
func1();
var testfun=function func1(){
alert(1);
}

在IE和其他浏览器的解释不同:

其他浏览器下,会把函数声明与函数表达式放一起的语句作为函数表达式处理,即代码中的
var testfun=function func1(){
alert(1);
}
会被当作函数表达式处理,因此无法被提前调用,但是注意,func1在函数内部是可见的,在外部是不可见的,你可以这样测试下:
var testfun=function func1(){
alert(1);
alert(func1);
}
testfun();
func1();

上述代码在非IE下testfunc会先弹出1,再弹出函数代码,说明内部func1是可见的,但是全局调用func1会报错,说明func1在外部是不可见的。


好了,下面说IE下的情况,IE是把这种情况的代码都做处理,即相当于即用了函数声明,又用了函数表达式,代码被解释为:
function func1(){
alert(1);
}
var testfunc = func1;

这样,func1在外部也是可见的,按照JS函数声明解析机制,func1因此可以在声明前调用。
vchalf_moon 2011-09-05
  • 打赏
  • 举报
回复
var b=function a(str) { alert(str); };
//var b=a;
b("afsadfsadf");
a("hell");
IE8 下是通过的
一個程序員 2011-09-05
  • 打赏
  • 举报
回复
javascript的预编译时机问题,准确的讲叫初始化

同一作用域代码段

function fn (){} 的初始化优先级高于 var声明的内容。

但在一个方法内部,用var声明的内容会提前被预编译,即:已进入方法优先初始化var声明的部分。

这种初始化时机也因个浏览器的不同而有所不同。

建议你的做法,只记住正确流程,不必记住反面例子。
连山秀举 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vchalf_moon 的回复:]

var a = function(){alert("a")}
var b = a;
应该理解为a,b 是一样的
[/Quote]还是不明白,可否说明白些。其实我想问,对于第二段代码,为什么Firebug说func1没定义。或者说:前两段代码有啥不一样的
vchalf_moon 2011-09-05
  • 打赏
  • 举报
回复
var a = function(){alert("a")}
var b = a;
应该理解为a,b 是一样的

87,990

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧