Javascript - 从另一个静态方法访问静态方法会抛出ReferenceError

时间:2016-06-08 08:11:02

标签: javascript static referenceerror

我已经定义了一个辅助类来创建一些对象。 当对象A包含Bs时,我试图从createA调用createB但是我得到一个“ Uncaught ReferenceError:createB未定义”。 JS不是我的主要语言,所以请原谅我,如果它是明显的东西;)

这是我的代码:

define([
  "model/A",
  "model/B",
  "model/C"
], function (A, B, C) {
  return {
    addTo: function (params, key, target, source) {
      if (params[key] !== undefined && params[key] !== null) {
        target.set(key, params[key], source);
      }
    },
    createA: function (params, source) {
      var result = new A();

      ...
      bDefs.forEach(function(bDef) {
        result.get("bs").push(this.createB(params,source));
      });
      return result;
    },
    createB: function (params, source) {

      var result = new B();
      ...

      result.get("cs").push(createC(params,source));
      return result;
    },
    createMediaType: function (params, source) {

      var result = new C();
      ...

      return result;
    }
  };
});

编辑:再次阅读问题我注意到我省略了可能导致问题的重要事项:我在forEach中调用createB()。我想匿名函数没有其他类的可见性。如何将 this 的引用传递给forEach?

1 个答案:

答案 0 :(得分:1)

这一行

result.get("bs").push(createB(params,source));

预计会有一个名为createB的范围内标识符。您的代码中没有一个。对象初始化程序中的属性键不会成为独立标识符(谢天谢地)。

假设createA将使用this引用您使用初始化程序创建的对象进行调用,您可以使用this.createB代替this。但它需要关于createB()的假设,这需要在代码中使用对象强制执行。我在下面给你一个替代方案。

  

我在forEach内拨打forEach。我想匿名函数没有其他类的可见性。

是的,确实如此。 (那不是一个班级。)

  

如何将对此的引用传递给forEach

this的第二个参数是在回调期间用作bDefs.forEach(function(bDef) { result.get("bs").push(this.createB(params,source)); }, this); // ^^^^ 的值,因此:

Function#bind

或者你可以使用this,但我不会在这里。

如果您使用的是ES2015(又名“ES6”),您可以使用箭头功能,因为箭头功能会关闭创建它们的上下文的// Requires ES2015 ("ES6") bDefs.forEach(bDef => { result.get("bs").push(this.createB(params,source)); }); 值:

this

您有第二个选项,它不依赖于调用代码来调用正确的forEach值,并且不要求您在define([ "model/A", "model/B", "model/C" ], function (A, B, C) { // Note how each of these is a function declaration; that defines // their names as in-scope identifiers within this anonymous function // and the functions created within it (which close over the context of // the call to this anonymous function where these are created). function addTo(params, key, target, source) { if (params[key] !== undefined && params[key] !== null) { target.set(key, params[key], source); } } function createA(params, source) { var result = new A(); ... result.get("bs").push(createB(params,source)); return result; } function createB(params, source) { var result = new B(); ... result.get("cs").push(createC(params,source)); return result; } function createMediaType(params, source) { var result = new C(); ... return result; } // Now we return the object return { addTo: addTo, createA: createA, createB: createB, createMediaType: createMediaType }; }); 中保留该值:您可以制作这些值在私有作用域中运行独立标识符,并将它们作为对象的属性返回:

// Requires ES2015 (aka "ES6")
return {
    addTo,
    createA,
    createB,
    createMediaType
};

旁注:在ES2015(又名“ES6”)中,最后的对象初始化程序可以更简洁:

Secugen's FDxSDKProAndroid.jar