我搜索了这个答案,但没有找到任何答案,尽管必须有一个简单的解释。以下函数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
答案 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.