JavaScript:函数声明与函数表达式

为什么这个是无效语法呢if(condition){functionsayHi(){alert("Hi!");}}else{functionsayHi(){alert("Y... 为什么这个是无效语法呢
if(condition){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}

而下面这个确是有效的
var sayHi;
if(condition){
sayHi=function sayHi(){
alert("Hi!");
};
}else{
sayHi=function sayHi(){
alert("Yo!");
};
}
展开
 我来答
晨光0703
2013-04-09 · 沉淀能力,积累经验,涅槃重生
晨光0703
采纳数:68 获赞数:1336

向TA提问 私信TA
展开全部

javascript虽然是解释执行的语言,但也会进行预编译。

if(condition){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}


这种形式,JS引擎在预编译的过程中会注册方法到window对象下,就是window.sayHi。

而不会顾及if else条件,导致重复的sayHi方法被注册,在这种情况下是无效语法。

var sayHi;
if(condition){
sayHi=function sayHi(){
alert("Hi!");
};
}else{
sayHi=function sayHi(){
alert("Yo!");
};
}


而下面这种是作为一个 变量(而非函数function),变量是可以被重复赋值的,所以语法不会有问题。


不知道有没有说清楚。

wuliupo
2013-04-09 · TA获得超过205个赞
知道小有建树答主
回答量:202
采纳率:0%
帮助的人:16.5万
展开全部

当然无效了,定义函数/对象有两种方式,一般来说效果是差不多,但是也有一点点区别:

方式1,

//这种定义,浏览器首先会把所有的函数定义先预留
function sayHi(){
alert("Hi!");
}

方式2,

//这种定义,浏览器运行到这一行,才会定义函数
var sayHi = function(){
alert("Hi!");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhaoapk
2013-04-09 · TA获得超过3771个赞
知道大有可为答主
回答量:1343
采纳率:40%
帮助的人:1614万
展开全部

我只说第一个。


第一个语法上没什么问题,但是和浏览器解析js不同而获得意想不到的结果。


1. 在前面调用。

sayHi();
var condition = true;
if(condition){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}

这种时候除了firefox会报错,其他的浏览器会弹出“Yo!"。


2. 在后面调用

if(true){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}
sayHi();

firefox会弹出"Hi!",其他的浏览器会弹出"Yo!"。


这里firefox会出现这种情况是因为firefox会把if里面的function定义当作表达式来处理。


MDN的原文

Functions can be conditionally declared. That is, a function definition can be nested within an if statement. Technically, such declarations are not actually function declarations; they are function expressions.


所以这种不兼容的方法不要使用。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Raiuy
2013-04-09 · TA获得超过2916个赞
知道大有可为答主
回答量:2210
采纳率:0%
帮助的人:896万
展开全部
第一段代码只是声明一个函数,并不是一个可执行的语句,而第二个是声明函数并把它赋值给一个变量,所以合法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zenewx
2013-04-09 · 超过20用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:19万
展开全部
实在不明白你这段代码的目的。

如果你只是需要在不同的condition提示不同的alert, 那么只需要如下就可以了。
if(condition){
alert("Hi!");
}else{
alert("Yo!");
}

如果你需要在不同的condition定义不同的SayHi()函数。那么很明显,只有下面的才是正确的。
上面的做法不管从任何角度看都是乱来。 如果JS支持把局部定义默认为全局的(PHP可以),那么上面这样就叫重复定义。如果JS不支持把局部当全局用,那么你上面的做法跳出if/else的范围,此函数为未定义(不存在).
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式