2014-05-14 72 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。 –