Javascript 未捕获类型错误无法设置未定义的属性‘0’
2015-07-12
461
此代码给出 UNCAUGHT TYPE 错误:无法设置 UNDEFINED 的属性“0”(..) 为什么会出现这样的错误?
function node() {
this.parent = null;
this.children = [];
}
node.prototype.m = function () {
var insertchild = function (parent, child) {
var i;
if (typeof this.children === "undefined")
i = 0;
else
i = this.children.length;
this.parent = parent;
this.children[i] = child;
console.log(parent + " " + child);
}
return insertchild;
}
var n = new node();
n.m()('A', 'B');
2个回答
问题出在 insertchild 函数中的
this
上
一种解决方案:
function node() {
this.parent = null;
this.children = [];
}
node.prototype.m = function() {
var insertchild = function(parent, child) {
var i = this.children.length;
// next four lines are not required
//if (typeof this.children === "undefined")
// i = 0;
//else
// i = this.children.length;
this.parent = parent;
this.children[i] = child;
console.log(parent + " " + child);
}
return insertchild.bind(this); // fix is here
}
var n = new node();
n.m()('A', 'B');
如果你处在没有 .bind() 方法的环境中
function node() {
this.parent = null;
this.children = [];
}
node.prototype.m = function() {
var me = this;
var insertchild = function(parent, child) {
var i = me.children.length;
me.parent = parent;
me.children[i] = child;
console.log(parent + " " + child);
}
return insertchild;
}
var n = new node();
n.m()('A', 'B');
我认为
Jaromanda X
2015-07-12
在函数 insertChild() 中,
this
关键字引用的是函数本身的作用域,而不是外部作用域(您想要的节点实例)
当您处于函数
insertChild()
的作用域中时,
this
关键字不引用
node
实例。它引用的是 insertChild() 的函数作用域。
快速修复
由于在
insertChild()
函数中引用
this
不会引用
node
实例,因此您只需将
this
变量委托给其他变量(例如
self
)即可轻松应对此问题,因此您仍然可以在
insertChild()
函数中保留对它的引用。
node.prototype.m = function () {
var self = this;
var insertchild = function (parent, child) {
var i;
if (typeof this.children === "undefined")
i = 0;
else
i = self.children.length;
self.parent = parent;
self.children[i] = child;
console.log(parent + " " + child);
}
return insertchild;
}
var n = new node();
n.m()('A', 'B');
TaoPR
2015-07-12