Javascript push.bind做什么?

Javascript push.bind做什么?,javascript,Javascript,我试图学习Javascript编码,遇到了这个问题,并提出了一些问题。results.push.bind(results)在这个问题中做什么?请参阅以下问题: 假设getData是一个函数,它接受查询对象并返回查询结果的承诺。还假设someArrayOfQueries是一个查询对象数组。解释以下代码将打印什么以及为什么: function runMultipleQueries(queries) { var results = []; queries.forEach(do

我试图学习Javascript编码,遇到了这个问题,并提出了一些问题。results.push.bind(results)在这个问题中做什么?请参阅以下问题:

假设getData是一个函数,它接受查询对象并返回查询结果的承诺。还假设someArrayOfQueries是一个查询对象数组。解释以下代码将打印什么以及为什么:

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将
直接推送到Promise
Promise;然后
它将在不同的范围内被调用

也就是说,关键字
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上时,你将能够向上投票好答案,向下投票坏答案。