假设我有一个如下定义的数组:
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);
}
但我想在不使数组全局化的情况下这样做。你会怎么做?
答案 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
}