Javascript 未将函数分配给另一个函数';铬合金的原型
以下代码在Firefox中正常工作,但在Chrome中不正常? 如果注释掉第15行以防止第7行出现错误(找不到this.update()),代码将继续正确执行。我不明白为什么第一组定义与第一组不同Javascript 未将函数分配给另一个函数';铬合金的原型,javascript,prototype,function-prototypes,Javascript,Prototype,Function Prototypes,以下代码在Firefox中正常工作,但在Chrome中不正常? 如果注释掉第15行以防止第7行出现错误(找不到this.update()),代码将继续正确执行。我不明白为什么第一组定义与第一组不同 if (typeof RegionUpdater == "undefined") { function RegionUpdater(param1, param2, param3) { this.paramA = param1; this.paramB = par
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);
我在这里有一个JSFIDLE设置:
编辑:我唯一能想到的是Chrome有一些推测性的执行,但事实上我在IE8中也遇到了同样的问题,这让我不太相信会发生这种情况。首先检查
这似乎是一个提升问题。if
语句被忽略,因为会发生以下情况:
if (typeof RegionUpdater === 'undefined') {
function RegionUpdater() {}
}
var RegionUpdater;
if (typeof RegionUpdater === 'undefined') {
RegionUpdater = 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(){};
...
}
因为事情就是这样发生的:
if (typeof RegionUpdater === 'undefined') {
function RegionUpdater() {}
}
var RegionUpdater;
if (typeof RegionUpdater === 'undefined') {
RegionUpdater = function RegionUpdater(){};
...
}
这很可能是起重问题,起作用了,但不起作用。您只看到第二个警报框,而不是第一个。你能解释一下什么是起重问题吗?看看我的回答是否有帮助。也不确定这是否是问题所在…或者使用函数表达式和赋值而不是像这样的声明:
var RegionUpdater=function(){…}
Mics建议的第四个代码示例就是我问题的答案。非常感谢你们两位。