为什么我不能将“this”设置为null以删除Javascript中的树节点?

时间:2018-04-19 22:11:04

标签: javascript

我正在尝试删除树中的根节点,并且树只有一个节点。由于“this”指的是节点的当前上下文,因此我将其设置为null this = null;(下面代码的情况2)。但是,我收到错误信息:ReferenceError: Invalid left-hand side in assignment。一种方法是使用delete this.val;(案例1)。

我的问题:为什么我不能设置this = null;来删除树对象?另一种删除obj的方法?谢谢。

var BST = function(val) {
  this.val = val;
  this.left = null;
  this.right = null;
}

BST.prototype.remove = function(val) {
  //delete this.val;  // Case 1: OK
  this = null;        // Case 2: WRONG !
}

BST.prototype.printTree = function() {
  if (this === undefined) {
    return;
  } else
    console.log(this.val);
}

var bst = new BST(70);
bst.remove(70);
bst.printTree();

2 个答案:

答案 0 :(得分:2)

一旦对您的对象的所有引用都消失了,它就会被清除。因此,如果this.leftthis.right也是树,则将this.leftthis.right设置为null将删除这些树,如果没有其他引用的话。换句话说,您可以通过从父节点而不是从节点中删除节点来删除节点。

答案 1 :(得分:1)

this是javascript中的关键字,不应位于作业的左侧,例如此处(案例2):this = null

执行delete this.val;(案例1)时,您将从val在函数范围内表示的任何上下文中删除属性this(在您的情况下为BST,因为它是原型功能)。

我相信您需要重构代码以使用root或父节点执行分支删除。像:

BST.prototype.remove = function(branchToDeleteRef) {
    this[branchToDeleteRef] = null;
}

如果您使用this.val = null,它也会有效,例如fiddle