更改js函数的定义在某些浏览器中不起作用

时间:2013-12-01 16:17:44

标签: javascript function internet-explorer

我搜索了这个答案,但没有找到任何答案,尽管必须有一个简单的解释。以下函数js在不同的浏览器中显示不同的结果...有人可以告诉我为什么?非常感谢

var i='a';

if (i=='a')  function theFunction(){alert('hi');}
else         function theFunction(){alert('bye');};

theFunction();

//ff results in hi
//ie results in bye
//chrome results in bye

3 个答案:

答案 0 :(得分:3)

问题是你在if块中使用了一个函数声明。

来自ECMA-262

  

注意已知有几种广泛使用的ECMAScript实现   支持将 FunctionDeclaration 用作语句。不过那里   是重要的,不可调和的变化   应用于这种语义的语义实现    FunctionDeclarations 。由于这些不可调和的差异,   使用 FunctionDeclaration 作为语句会产生以下代码:   在实现中不可靠地移植。建议这样做   ECMAScript实现要么禁止使用    FunctionDeclaration 或在此类用法发出警告时   遇到。 ECMAScript的未来版本可能会定义替代版本   用于在 Statement 上下文中声明函数的可移植方法。

如果您尝试在严格模式下使用您的代码,那么

SyntaxError: in strict mode code, functions may be declared only at top level or immediately within another function

相反,您可以使用

var i='a',
    theFunction;

if (i=='a')  theFunction = function(){alert('hi');}
else         theFunction = function(){alert('bye');};
theFunction();

或者,如果您的代码足够简单(如上例所示),请使用三元运算符:

var theFunction = i=='a'
    ? function(){alert('hi');}
    : function(){alert('bye');};

答案 1 :(得分:0)

您可以从条件表达式返回一个函数:

var i='a';
var theFunction=(function(){
    if (i=='a')  return function theFunction(){alert('hi');}
    else return function theFunction(){alert('bye');};
})();

theFunction();

/ *返回:' hi' * /

答案 2 :(得分:0)

我非常喜欢这种自我修改功能的模式。 它的想法是利用函数声明只是一个早期评估的var声明(用几句话说):

var seen=false;

function iWillSay() {
         if ( seen == false ) iWillSay = function() { alert('hi' );  };
         else                 iWillSay = function() { alert('bye');  };
         return iWillSay();
}

iWillSay();  // always says hi.