以下代码在 Firefox 中可以正常运行,但在 Chrome 中不能正常运行? 如果注释掉第 15 行以防止第 7 行出现错误(找不到 this.update()),代码将继续正常执行。我不明白为什么第一组定义与第一组不同。
if (typeof RegionUpdater == "undefined") {
function RegionUpdater(param1, param2, param3) {
this.paramA = param1;
this.paramB = param2;
this.paramC = param3;
this.update();
}
RegionUpdater.prototype.update = function() {
alert("hi there");
};
}
var ru = new RegionUpdater("1", 2, "3");
function LolUpdater(param1, param2, param3) {
this.paramA = param1;
this.paramB = param2;
this.paramC = param3;
this.update();
}
LolUpdater.prototype.update = function() {
alert("hi there");
};
var lu = new LolUpdater(1, 2, 3);
我在这里设置了一个 jsfiddle:http://jsfiddle.net/XhbZ8/2/
编辑:我能想到的唯一想法是 Chrome 正在进行某种推测性执行,但事实上我在 IE8 中也遇到了同样的问题,这让我不太愿意相信是这种情况.
最佳答案
首先检查Why are function declarations handled differently in different browsers?
这似乎是一个提升问题。 if
语句被忽略,因为这是发生的事情:
if (typeof RegionUpdater === 'undefined') {
function RegionUpdater() {}
}
上面的内容将在下面解释,因为函数被提升(移动到)最近的范围(函数)的顶部,在这种情况下范围是全局对象。
function RegionUpdater() {}
if (typeof RegionUpdater === 'undefined') {
// won't run since RegionUpdater is already defined
}
你可以像这样解决它:
var RegionUpdater = RegionUpdater || function RegionUpdater(){
};
编辑:正如 Mics 所说,使用函数表达式应该可行:
if (typeof RegionUpdater === 'undefined') {
var RegionUpdater = function RegionUpdater(){};
...
}
因为它是这样发生的:
var RegionUpdater;
if (typeof RegionUpdater === 'undefined') {
RegionUpdater = function RegionUpdater(){};
...
}
关于javascript - 函数未分配给 Chrome 中另一个函数的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17781871/