我正在学习javascript,并从一本书中重写了以下代码:
var controller = {};
controller.queue=[];
controller.add = function (func) {
controller.queue.push(func);
};
controller.run = function () {
controller.queue.shift() (controller.run);
}
function longRunA(callback){
console.log("A");
setTimeout(callback,2000);
}
function longRunB(callback){
console.log("B");
setTimeout(callback,1000);
}
controller.add(longRunA);
controller.add(longRunB);
controller.run();
打印输出是正确的,在B之后两秒钟A,这是他必须要做的。
有些事情我不清楚。
controller.run
打电话后他在括号里写controller.queue.shift ()
?我不知道是否已完成使函数递归的操作,也不了解周围的括号的作用controller.run
。控制台报告此问题:uncaught typeerror: controller.queue.shift (..) is not a function at controller.run
controller.add
带有longRunA
参数调用,但是我不明白为什么longRunA
不带参数调用函数是正确的。我会在函数定义中删除单词callback。Javascript中的函数可以是:
有关更多详细信息,请参见: MDN - First-Class Function
涉及有关代码的不同问题。
为什么在调用controller.queue.shift()之后在括号中写出controller.run
如果controller.queue.shift()
返回一个函数,则可以通过在其后面添加括号来调用它,就像其他任何函数一样,您可以向其传递参数。在这种情况下,controller.run
作为参数传递给由返回的函数controller.queue.shift()
以下代码段显示了一个示例:
function sayHi(name) {
console.log("Hi " + name + "!");
}
const arr = [sayHi];
arr.shift()("John");
在上面的代码片段中,arr.shift()
返回sayHi
我们随后使用括号调用的函数,()
并将“ John”作为参数传递。
控制台报告此问题:未捕获的类型错误:controller.queue.shift(..)不是controller.run中的函数
之所以会出现此错误,是因为在longRunB
函数内部调用了该callback
函数,即,controller.run
但是在调用该函数时,它尝试获取controller.queue
数组的第一个元素,但此时它为空。
解决此问题的一种方法是确保controller.queue.shift()
在尝试调用它之前为您提供了一个函数。
用longRunA参数调用controller.add,但是我不明白为什么不带参数调用longRunA函数是正确的
controller.add
是longRunA
要作为参数传递给的函数。longRunA
在这里没有被调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句