对array.shift()感到困惑 - 来自JS Ninja的Secrets的例子

时间:2014-04-17 15:10:57

标签: javascript

我正在读“JavaScript忍者的秘密”这本书,我在代码示例中坚持使用某种语法。如果你有这本书,可以在第17页找到该代码,但下面有一个样本。

function runTest() {
  if (!paused && queue.length) {
    queue.shift()();
    if(!paused) {
      resume();
    }
  }
}

有人可以解释第3行的内容吗? queue.shift()();做了什么?我已经查看了MDN上的文档,并且我在JSFiddle中使用了它,但我似乎无法弄明白。我怀疑它可能会删除数组中的前两个元素,但这不起作用,代码示例在没有第二组()的情况下也不会运行。

如果需要更多代码来理解这一点,请告诉我,我可以添加更多。

4 个答案:

答案 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

FIDDLE

同样的例子写得更详细

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