我正在读“JavaScript忍者的秘密”这本书,我在代码示例中坚持使用某种语法。如果你有这本书,可以在第17页找到该代码,但下面有一个样本。
function runTest() {
if (!paused && queue.length) {
queue.shift()();
if(!paused) {
resume();
}
}
}
有人可以解释第3行的内容吗? queue.shift()();
做了什么?我已经查看了MDN上的文档,并且我在JSFiddle中使用了它,但我似乎无法弄明白。我怀疑它可能会删除数组中的前两个元素,但这不起作用,代码示例在没有第二组()
的情况下也不会运行。
如果需要更多代码来理解这一点,请告诉我,我可以添加更多。
答案 0 :(得分:3)
shift
删除数组中的第一个对象,移动数组中的所有对象。
然后返回被删除的对象。
在您的示例中,对象必须是一个函数,然后调用它。
这是:
的简写var removedFunc = queue.shift();
removedFunc();
有关shift
的详细信息,请参阅MDN文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift
shift()方法从数组中删除第一个元素并返回 那个元素。此方法更改数组的长度。
示例( Demo ):
var a = [];
a.push(function(){
alert("a");
});
a.push(function(){
alert("b");
});
a.shift()(); //alerts a
a.shift()(); //alerts b
答案 1 :(得分:2)
queue
显然是一系列功能。队列中的第一个函数被shift()
关闭(即返回并从数组中删除),然后立即调用。
如果有帮助,请尝试:
var nextFunction = queue.shift();
nextFunction();
这是同样的事情,只是为了可读性而细分 - 当然,我本能地将()()
看作是一个错字。
编辑:你也可以让它看起来“不那么错字”:
queue.shift().call();
通过这种方式,你明确地调用了函数 - 再次,它做了完全相同的事情,但现在它看起来是故意的。
答案 2 :(得分:2)
shift()
获取数组中的第一个值,如果该值是一个函数,则可以像任何函数一样调用它
var queue = [ // array containing a function
function() {
alert('foo');
}
]
queue.shift()(); // alerts foo
同样的例子写得更详细
var queue = [ // array containing a function
function() {
alert('foo');
}
]
var fn = queue.shift();
fn();
答案 3 :(得分:2)
我认为queue
是一个数组。
Array.shift
删除数组的第一个元素并返回它。因此,如果queue
是一个函数数组,它将执行数组的第一个函数并将其删除。
var a = function () {
console.log('a');
}
var b = function () {
console.log('b');
}
var queue = [a, b];
queue.shift()(); // logs 'a'
queue.shift()(); // logs 'b'
console.log(queue.length) // logs 0