开发者问题收集

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