JavaScript方法未定义
JavaScript method is undefined
我正在努力学习JavaScript。作为这项工作的一部分,我正在编写一个基本的minimax AI。我有以下方法:
Computer.prototype.expand = function(node) {
/* adds all state action pairs to the node.successors array */
};
Computer.prototype.getMove = function(boardAr) {
console.log("getMove");
var b2 = boardAr.slice();
var i;
var action;
this.root = new TNode(b2, this.mark);
this.root.AIPlayedLast = false;
this.expand(this.root);
this.root.successors.forEach(this.minVal);
action = maxNode(root.successors);
this.draw(action);
registerMove(action, this.mark);
};
Computer.prototype.minVal = function(node) {
if (node.isTerminal) {
return;
} else {
this.expand(node);
node.successors.forEach(maxVal);
node.utility = this.minNode(node.successors).utility;
}
};
当调用getMove
方法时,对expand
的后续调用将按预期进行。但是,当从minVal
方法调用expand
时,我得到:
未捕获的类型错误:undefined不是函数。
我对此感到非常困惑。如有任何帮助/建议,我们将不胜感激。
我认为原因在这一行:
this.root.successors.forEach(this.minVal);
您将minVal作为无上下文引用传递,它将不会在您的计算机实例(此)的上下文中调用
以下是您可以改进的方法:
var self = this;
this.root.successors.forEach(function() {
self.minVal.apply(self,arguments);
})
最简单、最快捷的解决方案就是更改
this.root.successors.forEach(this.minVal);
至
this.root.successors.forEach(this.minVal.bind(this))
这与其他答案一样解决了问题,但在某种程度上,有些人可能会认为它更紧凑。
或者,您可以将"this"作为第二个参数传递给forEach
函数,这是forEach
:的一个使用不足的特性
this.root.successors.forEach(this.minVal, this)
此功能也可用于其他采用函数的Array
原型方法,包括map
、filter
、some
、every
(但不包括reduce
和reduceRight
)。
ES6箭头功能处理this
的方式不同,因此您可以执行
this.root.successors(forEach(e => this.minVal(e)));
forEach()方法可能会为每个继承者调用。因此,您传递Computer::minVal方法(this.minVal),但使用TNode(?)作为此指针。尝试:
var that = this;
this.root.successors.forEach(function(node) {
that.minVal(node));
});
相关文章:
- 骨干's Router.execute(callback,args,name)方法获取未定义的名称
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 使用javascript ajax post方法的未定义偏移PHP错误
- 在不兼容的接收器上调用的方法Set.prototype.add未定义
- PhoneGap无法调用未定义的方法loadurl
- jQuery验证器添加方法未定义
- Backbone中未定义的方法
- JS方法显示了未定义的简单示例
- TinyMCE验证给出错误:无法调用方法'getContent'的未定义
- 获取“;无法读取属性'[方法]'“未定义”;
- 续集返回未定义的模型自定义方法
- NoMethodError ('admin_application_path'的未定义方法)
- 理解modal.js中的未定义方法
- 带有base64的回形针:#<字符串:0xb46dba14>的未定义方法“stringify_keys”
- Rails 为 nil:NilClass 创建动作未定义方法 'each'
- 方法错误:未定义方法名称
- 在laravel 5.3中调用未定义方法IlluminateDatabaseQueryBuilder::attac
- addEventListener有无法解释的未定义方法错误
- 无法设置未定义方法的属性
- 带有ECMAScript6的JSHint:未定义方法