我已经定义了一个辅助类来创建一些对象。 当对象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?
答案 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