Javascript push.bind做什么?
我试图学习Javascript编码,遇到了这个问题,并提出了一些问题。results.push.bind(results)在这个问题中做什么?请参阅以下问题: 假设getData是一个函数,它接受查询对象并返回查询结果的承诺。还假设someArrayOfQueries是一个查询对象数组。解释以下代码将打印什么以及为什么:Javascript push.bind做什么?,javascript,Javascript,我试图学习Javascript编码,遇到了这个问题,并提出了一些问题。results.push.bind(results)在这个问题中做什么?请参阅以下问题: 假设getData是一个函数,它接受查询对象并返回查询结果的承诺。还假设someArrayOfQueries是一个查询对象数组。解释以下代码将打印什么以及为什么: function runMultipleQueries(queries) { var results = []; queries.forEach(do
function runMultipleQueries(queries) {
var results = [];
queries.forEach(doQuery);
return results;
function doQuery(query) {
getData(query)
.then(results.push.bind(results));
}
}
function log(value) {
console.log(value);
}
runMultipleQueries(someArrayOfQueries).forEach(log);
push.bind做什么
调用时返回数组的.length
函数runMultipleQueries(查询){
var结果=[];
返回Promise.all(querys.map(doQuery));
函数doQuery(查询){
返回承诺。解析(查询)
.then(results.push.bind(results))
}
}
函数日志(值){
console.log(值);
}
运行多个等式([10,20,30]),然后运行(log)代码>与其他面向对象语言不同,Javascript中的变量this
非常复杂,可以多次更改
当使用数组时,函数push
会获取它被称为“on”的数组,并在其末尾放置一个新元素。在这种情况下,push函数通过读取此
变量来知道它正在处理什么数组
想象一下这个示例代码:
var myDataStructure = {};
myDataStructure.value = 0;
function addOneToValue() {
this.value += 1;
}
myDataStructure.addOne = addOneToValue;
myDataStructure.addOne(); // here - the variable `this` == myDataStructure
但是,如果使用代码addOneToValue()
调用函数addOneToValue
,那么this
的值实际上不是myDataStructure
。它是未定义的,或像窗口
这样的全局对象*
要手动强制addOneToValue
始终使用myDataStructure
作为此
值,可以执行以下操作:
addOneToValue = addOneToValue.bind(myDataStructure);
现在您可以安全地调用addOneToValue()
,因为这个
值绑定到myDataStructure
在代码中,runMultipleQuery
将函数传递给另一个处理程序,该处理程序不会像results.push那样调用函数。这意味着调用函数时,push
将再次具有不确定的此值。但是,通过调用bind,我们可以确保runmultiplequiry
调用push
函数并强制this
成为results
变量。什么是results.push.bind(results)
的作用是强制push
的方法调用使用results
的范围
TLDR强>
结果
是一个数组results.push()
是对Array#push
的调用,但是通过传递函数results.push将
直接推送到PromisePromise;然后
它将在不同的范围内被调用
也就是说,关键字this
将引用不同的对象
通过使用bind
(例如-),范围将“绑定”到特定对象
这是因为JavaScript是一种原型语言,而不是一种面向对象的语言 欢迎来到堆栈溢出!请仔细阅读,环顾四周,仔细阅读,特别是作业通常不是随意的;您的讲师、教程或课程将涵盖必要的主题,使您能够做到这一点。复习你的课程材料、课堂笔记等,并试着做这项工作。如果你遇到了一个特定的问题,彻底地研究它,如果你仍然困在那里,就发布你的代码和问题的描述。人们会很乐意提供帮助。的可能重复,尽管这里真正需要的只是研究。。bind
是一种允许您将上下文附加到方法的方法。对于一个新来者来说,这可能听起来像胡言乱语。在基本术语中,当您有一个带有方法的对象时,您可以在任何其他对象上调用该方法,只要您指定使用.bind
或或.apply
,等等。这是在JavaScript中工作时的一个重要概念,特别是在处理诸如currying/closures/等中间主题时。因此值得一看。我建议在这里发布之前搜索StackOverflow、MDN(mozilla开发者网络)和其他资源进行更彻底的研究。不会打印任何内容(可能除了错误消息,即数组(results
)没有。然后()
方法。请注意,偶数承诺是异步的!正确的实现是函数runMultipleQueries(querys){return Promise.all(querys.map(getData));}
您能解释一下为什么第一个代码段记录[1,2,3]
吗?我怀疑它没有达到您的预期,或者OP的预期。@Bergi“你能解释为什么第一个代码段记录了[1,2,3]
?”不确定你的意思?你得出的结论是OP期望的是什么?不,我指的是这些数字的来源(1
,2
和3
)。请带我看一下。或者试着传递其他数字,看看你是否能解释答案的结果。你可能想调整答案的这一部分。@Bergi请参阅更新的帖子。如果缺少描述,请给出建议。谢谢你提供的详细示例,我现在明白了。bind()是的!没问题!如果我回答了你的问题,请按绿色复选标记以标记正确答案。当你花更多时间在StackOverflow上时,你将能够向上投票好答案,向下投票坏答案。