JavaScript 你觉得它会输出什么?

ane · 2014年03月01日 · 最后由 iBachue 回复于 2014年03月02日 · 2447 次阅读
if (true) {
   function foo() {
     return 'first';
   }
 }
 else {
   function foo() {
     return 'second';
   }
 }
 foo();
if true
 def foo
   return 'first'
  end
else
  def foo
    return 'second'
  end
end

foo

还是 ruby 的比较好理解... 😄

2 楼 已删除
3 楼 已删除

'second' 吧? 还是浏览器相关?

function foo() 这个声明是不受程序流或者控制流影响的, 甚至可以先用后声明...

foo();
function foo() {
  alert('second')
}

坚持 var foo = function(){ ... } 结果就容易预测一点, coffeescript 就总是用 var + 匿名函数的方式

function foo() { return 'first'; }

function foo() { return 'second'; }

foo();

声明提升。跟变量声明一样。另外函数声明和变量声明这俩同时出现也会有化学反应的

function a() {}
var a;

function b() {}
var b = 1;

JavaScript 的 function,变量,好像是在无论在哪定义,都是可以找到的。后面那个会把前面的覆盖掉。而且 JavaScript 是 function scope,if,for 什么的没有增加一个 scope(java 就不是)。

顺便一提

}
 else {

这个似乎有的浏览器会在第一个"}"后面自动加上";" 不太确定,好久没碰 JavaScript 了。。。

#4 楼 @luikore 浏览器相关的,Firefox 结果就是'first'

强烈不建议这种写法,Javascipt 中有个函数声明提升机制,如果是声明式函数这种写法在不同浏览器中会出现不同的状态,如果你非得这么些的话还是用函数表达式,例如:

if(true){
var fn = function (){};
}else{
var fn = function (){}
}

其实我有时会利用这种机制 有意把比较主要的调用部分代码写前面 实现细节写后面 JS 做这个容易很多 但是平心而论 确实喜欢 Ruby 的声明方法 只有这种方法是 make sense 的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号