JavaScript -将名称空间分配给局部变量以用于构造函数,但不确定发生了什么

JavaScript - Assigning namespaces to local variables for use in constructors, not sure what is happening?

本文关键字:构造函数 用于 不确定 什么 发生了 局部变量 空间 分配 JavaScript      更新时间:2023-09-26

这样的东西是有效的吗?

(function () {
    "use strict";
    var Smtg = window.some.namespace.Something,
        Els = window.another.namespace.Else;
    var smtg = null,
        els = null;
    smtg = new Smtg();
    els = new Els();
    smtg.doSomething(els);
}());

即使用将构造函数重命名为更短的局部变量,然后从这个更短的局部变量实例化?

只有我得到像TypeError: Smtg is not a constructor这样奇怪的错误。当window.some. namspace . something为;

window.some = {};
window.some.namespace = {};
window.some.namespace.Something = (function () {
    "use strict";
    this.doSomething = function (els) {
        els.blah();
    }
});

(想象window.another. namspace . else与上面类似)

我以为这一切都没问题,不是吗?

如果可以,可能的错误原因是什么?

浏览器将抛出错误TypeError: Smtg is not a constructor当且仅当Smtg确实不是构造函数

如果Smtg是控制台中的一个函数,那么您可能在声明它之前尝试创建一个新实例。或者它在

中试图使用它的范围内被覆盖

示例-这将抛出一个错误

window.name = {}
window.name.space = {}
window.name.space.something = (function(){});
function test(){
   var scopeOverwriter = function(){
       this.name = "not a obejct anymore";
       this.getNewSomething();
   }
   scopeOverwriter.prototype = {
       getNewSomething = function(){
           return new name.space.something();//name is a string here
       }
   }
   return new scopeOverwriter();
}
test();

是的,它是绝对有效的,只要window.some.namespace.Something是一个对象(即不是一个文字)。

这是因为JavaScript中的对象就像C中的指针(即它们"指向"内存中的某个位置)。将Smtg赋值给window.some.namespace.Something仅仅意味着它们都指向内存中的同一位置。

例如,你可以说:

var body = document.body;
alert(body.innerHTML); // same as alert(document.body.innerHTML);

问题出在你的代码里。这里有一个修复:http://jsfiddle.net/yRuvf/

好的,所以我有一个连接器,遍历我的项目中的所有文件,并连接和缩小文件,并创建一个dev html与所有脚本单独。最近,我更改了应用程序入口点的名称,在concattenator(我很快编写的)中,我通过在任何地方写入字符串来引用文件,而不是将其放在一个静态变量中(我知道……)我将其更改为新的,并将其更新为使用静态变量,但忘记更新其中一个引用。

应用程序从列表中删除入口点,并将其添加到末尾。

然而,因为我忘记更新其中一个引用,文件被添加了两次,一次在列表中找到它,一次在末尾。因此,当第一个文件被包含(在我的dev html中单独列出所有脚本)时,它引用了"未定义"而不是函数,在后者的脚本中,一切都很好,所以我的应用程序即使显示错误也会运行,所以我完全困惑了。

这就是为什么连接的文件工作没有错误,因为它不依赖于相同的引用。eeesh !真是个笨蛋。

因此,当我开始思考时,我一定是在重命名命名空间时出现了系统错误,这使我完全看错了位置。

所以…当错误生成时,它确实不是构造函数,因为它当时没有定义。但后来它被定义为…代码会运行。

每个回答的人都帮助我找到了这个bug,我能够找到它,一旦我知道javascript是有效的,因为我知道我应该在另一个位置寻找这个bug。

我希望我能接受不止一个答案!唉,我不能。

如果你正在做这样的事情:

var Obj = {};

则该对象不具有可用于new的构造函数:

var o = new Obj();

构造函数在javascript中基本上是一个函数所以你可以这样做:

var Obj = function(){};
var d = new Obj();