Javascript - 在未定义的对象上调用new

时间:2016-03-11 22:49:56

标签: javascript requirejs

我正在使用require.js来组织我的js:

define([
   'underscore',
   'sylvester',
   'glUtils',
   'GLFacade',
   'Item',
   'Attribute',
   'Buffer',
], function(
   _,
   sylv,
   glUtils,
   GLFacade,
   Item,
   Attribute,
   Buffer
) {
   "use strict";
   function Sprite() { this.init.apply(this, arguments); }

   _.extend(Sprite.prototype, {
      init: function(prog, img, viewPort) {
         this._frameNum = 0;
         this._framesPerAnimation = 4;
         this._prog = prog;
         this._viewPort = viewPort;
         this._img = new ImageWrapper(img);

         //...other initialization stuff...
      },

      //...other methods...

   });

   return Sprite;

});

但我一直遇到错误,我忘记将模块添加到文件的顶部。上面我忘了将ImageWrapper添加到我的依赖项中。当我执行此操作时,即使ImageWrapperundefined,我的代码也会以无错误消息的方式静默失败。如果我尝试记录console.log(ImageWrapper),我确实会收到错误。

为什么对new ImageWrapper(img)的构造函数调用失败并显示错误?是否有类似"use strict;"的内容可用于在开发过程中增加错误信息?

1 个答案:

答案 0 :(得分:1)

您可以使用像http://jshint.com/这样的工具来填充您的代码 - 您将得到类似的内容:

One undefined variable
27  ImageWrapper

根据您的设置,有不同的自动化方法,一些编辑器已经构建了这个,或者插件可以扩展此功能。如果要手动运行jshint,npm上还有一个命令行版本:https://npmjs.org/package/jshint

您的代码应该抛出错误,但前提是您实例化new Sprite

当我尝试像这样简化你的代码时

define('Sprite', ['underscore'], function(_) {
  'use strict';

  function Sprite() {
    this.init.apply(this, arguments);
  }

  _.extend(Sprite.prototype, {
    init: function() {
      this._foo = new DoesntExist();
    }
  });

  return Sprite;
});

require(['Sprite'], function(Sprite) {
  var sprite = new Sprite();
});

它会按预期抛出ReferenceError。