2014-05-14 70 views
3

我有以下聲明變量的JavaScript文件:腳本錯誤:變量未定義

var page = page || {}; 

上述文件包含在想要利用頁面變量的另一個JavaScript文件。在嘗試輸入時,我可以在intellisense中看到該變量。

但在運行時,我得到錯誤:

頁沒有定義。

我張貼更復雜的代碼:

第一個文件是隻有一個行

var page = page || {}; 

第二個文件使用上述變量page.js:

/// <reference path="page.js" /> 

page.current = function() { 
}; 

還有最後第三檔:

/// <reference path="../pagescripts/page-current.js" /> 
define(function() { 

var Agencies = function (app, datacontext, logger, config, router) { 
    var myPage = page.current; 
    //The above line throws error saying page is not defined. 
}); 
}; 
+0

這種類型的_ReferenceError_通常發生在你'「使用嚴格」;'模式,不'var' –

+5

您發佈不會產生錯誤的代碼。我假設你試圖訪問'page'的地方,它不在範圍內。你應該在你試圖訪問變量的地方發佈代碼。我們需要一個更完整的例子。 –

+0

@FelixCling你說的證明http://jsfiddle.net/5A6f4/ –

回答

2

在多個文件中使用相同的命名空間對象時,通常會使用此模式。通過將

var page = page || {}; 

頂部觸及該命名空間的每個文件的,你保證page將指向同一個對象,你可以以任何順序,如果你的代碼允許加載它們。

// page1.js 
var page = page || {}; 
page.doSomething = function() {}; 

// page2.js 
var page = page || {} 
page.doSomethingElse = function() {}; 

// page3.js 
var page = page || {}; 
page.doThirdThing = function() {}; 
+2

'var page = page ||'有什麼問題? {};'?它實際上是'var page; page = page || {};'。它永遠不會拋出一個錯誤。 –

+0

OP使用的代碼很好。 'page'是未定義的,它是一個空對象。這不是這個錯誤的原因。 –

+0

@FelixKling我明白了...... –

1

確保在使用它的文件/腳本標記之前加載定義變量的JavaScript文件。

+0

但是不應該默認爲{},如果情況不是這樣的話裝? – jamie

+0

@jamie它不會_default到_'{}',它總是'{}',因爲'page'在頁面||之前被初始化爲_undefined_。 {}'and _undefined_ is _falsy_ –

-3

如果由於某種原因無法更改腳本文件加載的順序,那麼您可以使用dom onready函數來訪問此變量。作爲一個經驗法則,你應該延遲邏輯的執行直到dom準備好。例如jQuery中您可以使用

$(document).ready(function() { 
// application init logic 
// or start execution of functions 
    if(page && page.whatever) { 
     page.whatever(); 
    } 
}) 
+1

請不要在未標記jQuery時提供jQuery解決方案。你不需要臃腫的網站訪問一個變量。 –

+0

jQuery參考僅僅是一個例子,展示瞭如何使用dom。 –