【问题标题】:Script error : variable is undefined脚本错误:变量未定义
【发布时间】:2014-05-14 17:13:13
【问题描述】:

我有一个声明以下变量的 javascript 文件:

var page = page || {};

上述文件包含在另一个想要使用页面变量的 javascript 文件中。尝试键入时,我可以在智能感知中看到该变量。

但在运行时,我收到以下错误:

页面未定义。

我正在发布更详细的代码:

第一个文件是 page.js,只有一行

var page = page || {};

第二个文件使用上述变量:

/// <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.
});
};

【问题讨论】:

  • 这种类型的ReferenceError通常发生在你"use strict";模式没有var
  • 您发布的代码不会产生该错误。我假设您正在尝试访问不在范围内的page。您应该在尝试访问变量的位置发布代码。我们需要一个更完整的例子。
  • @FelixCling 你所说的证明jsfiddle.net/5A6f4
  • 所有文件是如何组合在一起的?您确定要在第二个文件之前加载 page.js 吗?通常,如果您要在多个文件上定义一个模块,您会在每个文件的顶部有 var page = page || {};,以便它们可以按任何顺序包含。
  • 似乎第三个文件在其他文件之前加载,或者在第二个文件加载后覆盖了page

标签: javascript variables undefined scope


【解决方案1】:

这种模式通常在跨多个文件使用相同的命名空间对象时使用。通过放

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() {};

【讨论】:

  • var page = page || {}; 有什么问题?实际上是var page; page = page || {};。它永远不会抛出错误。
  • OP 使用的代码很好。是page 是未定义的,它是一个空对象。这不是导致此错误的原因。
【解决方案2】:

确保在使用它的文件/脚本标记之前加载定义变量的 javascript 文件。

【讨论】:

  • 但是如果没有加载,它不应该默认为 {} 吗?
  • @jamie 它不会默认为 {},它总是{},因为page 被初始化为undefinedpage || {}undefined 之前是 falsy
【解决方案3】:

如果由于某种原因你不能改变脚本文件加载的顺序,那么你可以使用 dom onready 函数来访问这个变量。根据经验,您应该延迟执行逻辑,直到 dom 准备好。例如在 jQuery 中你可以使用

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

【讨论】:

  • 请不要提供未标记 jQuery 的 jQuery 解决方案。您无需膨胀您的网站即可访问变量。
  • jQuery 参考只是展示如何使用 dom onready 的一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2015-01-25
  • 2018-05-03
相关资源
最近更新 更多