javascript - 函数未分配给 Chrome 中另一个函数的原型(prototype)

标签 javascript prototype function-prototypes

以下代码在 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/

相关文章:

javascript - 谷歌浏览器开发者工具 : search for exact match

javascript - 如何在 JS 的 setInterval 中等待?

javascript - 在 Yii2 中使用 Javascript 获取隐藏输入字段设置的值

javascript - 在原型(prototype)上声明一个新方法

JavaScript 原型(prototype)属性 : Prototype based Inheritance

c - 带有 void* 参数的函数原型(prototype)

c - 编译C程序时“Function prototypes are an ANSI feature”错误

Javascript:将方法添加到数组中的所有对象

javascript - 如何在 javascript 中使用相同的函数,在 html 中的相同类中

JavaScript 原型(prototype)继承显示父对象名称