2013-04-02 58 views
0

是這樣的有效?JavaScript - 爲命名空間分配局部變量以用於構造函數,不確定發生了什麼?

(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.namespace.Something是;

window.some = {}; 
window.some.namespace = {}; 
window.some.namespace.Something = (function() { 
    "use strict"; 

    this.doSomething = function (els) { 
     els.blah(); 
    } 

}); 

(想象window.another.namespace.Else類似於以上)

我曾以爲這都將是好的,不是嗎?

如果沒問題,可能的原因是什麼?我找不到可能出錯的地方。

+0

[Alias function in javascript](http://stackoverflow.com/questions/13000020/alias-function-in-javascript) –

+1

'some'和'some.namespace'都可能是之前的對象你可以爲'some.namespace.Something'指定一個值。 – Josh

+0

上面是從一個更大的代碼片段中取得的僞代碼,所有相關的命名空間都存在於原始代碼中,爲了避免這種混淆,我將編輯這個問題。 – Neilos

回答

1

當瀏覽器會拋出錯誤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(); 
+0

我是**試圖創建一個新的實例,然後宣佈它**即使我不是故意的!看到我的答案澄清。 – Neilos

0

如果你正在做這樣的事情:

var Obj = {}; 

那麼這是不是與構造對象,您可以用新的使用方法:

var o = new Obj(); 

構造函數中的JavaScript基本上是一個功能,讓你可以做這樣的事情:

var Obj = function(){}; 

var d = new Obj(); 
+0

我不是那麼做的。 – Neilos

+0

那麼怎麼c如果我們不知道你在做什麼,我們會告訴你什麼是錯誤? – Adidi

+0

但是你寫的是完全正確的。 但我正在創建對象,然後將函數添加到使用'new'實例化的對象。事實證明,我的JavaScript完全有效。問題在別處。謝謝你的貢獻,雖然;) – Neilos

1

是的,它是絕對有效的,只要window.some.namespace.Something是一個對象(即,不是文字)。

這是因爲JavaScript中的對象就像C中的指針(即它們「指向」內存中的某個位置)。指定Smtgwindow.some.namespace.Something只是表示它們都指向內存中的相同位置。

例如,你可以說:

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

的問題是在你的代碼。這裏有一個修復:http://jsfiddle.net/yRuvf/

+0

這是標題問題的答案,但不是我的問題的答案,因此我接受喬希的答案,如果我也可以接受,我會:D – Neilos

1

好了,我有過在我的項目中的所有文件和itterattes一個連接符concattenates並縮小文件並單獨創建一個包含所有腳本的開發html。最近我改變了我的應用程序的入口點的名稱,在concattenator(我很快寫道)中,我通過將字符串寫入到處而不是在一個靜態變量(我知道...)中改變它並將其更新爲使用靜態變量並忘記更新其中一個引用。

應用程序從列表中刪除了入口點並將其添加到結尾。

但是,因爲我忘記更新其中一個參考文件,因此文件被添加了兩次,一次在列表中找到,一次在末尾。所以當第一個文件被包含時(在我的開發html中,它列出了所有的腳本)它引用了'undefined'而不是函數,在後面的腳本中一切正常,所以我的應用程序甚至會運行錯誤顯示,所以我徹底困惑。

這就是爲什麼連接文件沒有錯誤,因爲它不依賴於相同的引用。 eeesh!什麼是polava。

因此,當我開始思考時,我必須在重命名命名空間時出現系統錯誤,這使得我完全看錯了位置。

所以......當錯誤發生時,它確實不是一個構造函數,因爲它當時沒有定義。但是後來它被定義了......並且代碼會運行。

回答的每個人都幫助我找到了這個bug,一旦我知道javascript是有效的,我知道我應該在另一個位置尋找bug。

我希望我可以接受多個答案!唉,我不能。

相關問題