gpt4 book ai didi

javascript - 不需要参数的回调 - 为什么?

转载 作者:行者123 更新时间:2023-11-28 19:00:36 26 4
gpt4 key购买 nike

所以,我一直在研究这个由两部分组成的问题并设法解决它,但是我对代码的实际工作原理有一些疑问 - 特别是回调函数的性质。下面列出了问题的两个部分,以及我对这两部分的解决方案。我能够相当轻松地解决第一部分,但第二部分对我来说更具挑战性。

// FIRST PART OF PROBLEM

var merge = function(array1, array2, callback){
//your code here.
}

var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){
return a + b;
});

//x should now equal [6, 8, 10, 12].


// MY SOLUTION:
var merge = function(array1, array2, callback){
var newArray = [];

for (var i = 0; i < array1.length; i++) {
newArray[i] = callback(array1[i], array2[i]);
}
return newArray;
}

var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){
return a + b;
}); // x equals [6, 8, 10, 12].

现在这是我能够解决的问题的第二部分,但我遇到的麻烦是具体一步一步地遍历代码。我的问题是 - 为什么我不需要向合并函数的回调参数提供任何参数?当我尝试提供参数时,x 变成了 NaN。

欧几里得距离 = sqrt((x2-x1)^2 + (y2-y1)^2))。"

var euclid = function(coords1, coords2){  
//Your code here.
//You should not use any loops and should
//instead use your original merge function.
}

var x = euclid([1.2, 3.67], [2.0, 4.4]);

//x should now equal approximately 1.08.


// My solution:
var euclid = function(coords1, coords2){
// // why does function() below require no parameters?
var merged = merge(coords1, coords2, function() {
return (coords1[0] - coords2[0]) * (coords1[0] - coords2[0]) +
(coords1[1] - coords2[1]) * (coords1[1] - coords2[1]);
});

return Math.sqrt(merged[0]);
};

var x = euclid([1.2, 3.67], [2.0, 4.4]); //x does equal approximately 1.08.

我是编程新手,所以我意识到这可能是一个相当微不足道的问题。但是,如果能帮助我了解回调在该解决方案中的实际工作原理,我将不胜感激。谢谢!

最佳答案

why did I not need to give the callback parameter to the merge function any parameters?

给定:

var euclid = function(coords1, coords2){

// why does function() below require no parameters?
var merged = merge(coords1, coords2, function() {
return (coords1[0] - coords2[0]) * (coords1[0] - coords2[0]) +
(coords1[1] - coords2[1]) * (coords1[1] - coords2[1]);
});

return Math.sqrt(merged[0]);
};

传递给merge函数的(回调)函数对其外部作用域的变量有一个闭包。在 Euclid 的形参列表中包含 coords1coords2 使它们成为局部变量,因此不需要将它们传递给回调。

如果函数是在 Euclid 范围之外创建的,那么您需要传递它们(或以其他方式引用它们)。

顺便说一句,我更喜欢函数声明而不是表达式赋值,例如

function euclid(coords1, coords2) {
// code here
}

因为它使函数的名称更加明显。考虑:

var foo = function fred() {
// foo or fred in here
};

// only foo out here

关于javascript - 不需要参数的回调 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com