从数组中删除元素,然后保留其状态以供将来使用,而不使用全局变量

时间:2013-12-04 08:14:03

标签: javascript arrays element state

假设我有一个如下定义的数组:

var str = ['H', 'e', 'l', 'l', 'o'];

我有一个按钮,当用户点击它时,应该删除字符串的第一个元素并在删除后返回结果数组(即['e', 'l', 'l', 'o'])。结果数组也应保存,下次按下按钮时,数组中的下一个元素将被删除(即结果数组将为['l', 'l', 'o']),依此类推,直到删除所有元素为止。

如果数组是全局的,那么这非常简单:

var str = ['H', 'e', 'l', 'l', 'o'];

function remove_first(the_array) {
    the_array.shift();
    return the_array;
}

del.onclick = function() {
    result = remove_first(str);
}

但我想在不使数组全局化的情况下这样做。你会怎么做?

3 个答案:

答案 0 :(得分:2)

您必须在事件处理程序之外定义数组,因为它必须在事件处理程序的调用之间保持不变。

但是您不必在全局范围内定义数组或函数来使其工作,任何共享范围都可以。因此,您可以使用IIFE创建新范围:

(function() {

    var str = ['H', 'e', 'l', 'l', 'o'];

    function remove_first(the_array) {
        the_array.shift();
        return the_array;
    }

    del.onclick = function() {
        var result = remove_first(str); // don't forget `var` here
    }

}());

答案 1 :(得分:1)

您不需要将数组设为全局变量。

只需使用Javascript闭包功能,您就可以做同样的事情。

var functionForClosure = function () {

    var str = ['H', 'e', 'l', 'l', 'o'];

    function remove_first(the_array) {
        the_array.shift();
        return the_array;
    }

    del.onclick = function() {
        result = remove_first(str);
    }
};
functionForClosure();

那里有一个str变量可以访问你的onclick函数; str不是全局的,而是functionForClosure函数的本地。

答案 2 :(得分:0)

如何使用javascript闭包?

var ns = (function () {
    var str = ['H', 'e', 'l', 'l', 'o'],
        removeFirst = function () { 
            str.shift(); 
            return str; 
        };

    return {
        str: str,
        removeFirst: removeFirst
    };
}());

del.onclick = function () {
    result = ns.removeFirst();
    // console.log(ns.str) to see the result of str
}