变量总是NaN

时间:2013-03-07 05:19:52

标签: javascript data-structures nan

我正在学习JS(但不是编程新手)。所以,我正在尝试实现一个LinkedList,只是为了解决JS。

除了count始终返回NaN之外,它可以正常工作。我用谷歌搜索,并认为原因是我最初并没有将count设置为数字,但我做了。

以下是我的代码:

function LinkedList() {
    var head = null,
        tail = null,
        count = 0;

    var insert = function add(data)
    {
        // Create the new node
        var node = {
                data: data,
                next: null
        };

        // Check if list is empty
        if(this.head == null)
        {
            this.head = node;
            this.tail = node;
            node.next = null;
        }
        // If node is not empty
        else
        {
            var current = this.tail;
            current.next = node;
            this.tail = node;
            node.next = null;
        }

        this.count++;
    };

    return {
        Add: insert,
    };
}

var list = new LinkedList();
list.Add("A");
list.Add("B");

1 个答案:

答案 0 :(得分:2)

this中的this.count引用LinkedList对象的实例。 部分:

var head = null,
    tail = null,
    count = 0;

这些是私有变量,不被视为LinkedList对象的属性。

您想要做的是:

this.head = null;
this.tail = null;
this.count = 0;

这将使headtailcount成为LinkedList对象的属性,以便您可以执行this.count++

编辑:要将headtailcount保密为LinkedList对象,您的其他代码将是这样的:

// Check if list is empty
    if(head == null)
    {
        head = node;
        tail = node;
        node.next = null;
    }
    // If node is not empty
    else
    {
        var current = tail;
        current.next = node;
        tail = node;
        node.next = null;
    }

    count++;

另请注意,对象是传递引用。这适用于:

var current = tail;
current.next = node;
tail = node;
node.next = null;

更多:如果您希望count成为公共媒体资源,则不要返回:

 return {
        Add: insert,
    };

你需要这样做:

this.Add = insert;
return this;

以便在创建对象时返回当前对象上下文。