gpt4 book ai didi

javascript - Node JS 匿名函数和回调

转载 作者:数据小太阳 更新时间:2023-10-29 05:04:04 27 4
gpt4 key购买 nike

有人请帮助我。我一直在阅读大量 javascript 文档并摆弄 javascript。

我能够使用这些函数,但我不太明白这里进行的基本句法爵士乐

          var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, 'myhost');

console.log('Server running at http://myhost:1337/');

我想不通为什么可以在上面的匿名函数中使用 req 和 res。就好像他们住在 http 的某个地方。他们没有在任何地方宣布!它们由引用内部对象或其他内容的匿名函数中的变量名组成。这太疯狂了。

这样的回调函数是如何实现的?

或者喜欢

          stream.on('data', function(data){  
// use data... i dont know where its coming from
// or how it got there, but use it
});

如果您可以发布一个模拟此过程和语法的小示例,或者解释这些回调函数如何像这样工作,或者我如何将这些未声明的变量传递给这样的函数,我将不胜感激。

与下面发布的答案类似的示例。

     var b = {                  
somefunction : function( data ){
var x = 100;
x = x+1; // 101

return data(x); // returns the callback function data w/ value x
}
};

b.somefunction(function(foo){
foo++; // 101 + 1
console.log(foo); // prints 102
});

最佳答案

主要问题是 Javascript 是一种函数式语言,因此您可以将函数作为参数传递给其他函数。例如,在其他语言中,您可能经历过将指针或句柄传递给函数。考虑一个简单的情况,其中您有一些数学函数:

function add(a,b) {return (a+b)};
function subtract(a,b) {return (a-b)}:

现在我可以创建一个新函数:

function longWayAroundTheBarn(num1,num2,theFunc)
{
// invoke the passed function with the passed parameters
return theFunc(num1,num2);
}

然后这样调用它:

console.log(longWayAroundTheBarn(1,2,add));

> 3

或者甚至像这样:

console.log(longWayAroundTheBarn(longWayAroundTheBarn(2,2,subtract),4,add);

> 4

显然,这将是一种愚蠢的使用回调,但您通常可以想象,以这种方式“插入”函数的能力非常强大。

考虑一下您是否无法传递函数。这可能是您实现它的一种方式:

function reallyLongWayAround(num1,num2,funcName)
{
if(funcName==='add')
return add(num1 ,num2);
else if (funcName === 'subtract')
return subtract(num1, num2);
}

您可以想象,除了必须编写和维护的非常繁琐的代码之外,它还没有那么强大,因为 reallyLongWayAround 函数只能调用它知道的代码。通过传递函数,我的 longWayAroundTheBarn 不关心我是否创建新函数并将其传递给它。请注意,由于弱类型,它甚至不需要关心它传递的参数。也许你想实现类似的东西

 function businessDaysBetween(d1,d2)
{
// implementation left as a reader exercise
};

调用:

longWayAroundTheBarn(new Date(2014,1,15), new Date(2014,1,22),businessDaysBetween)

回到您提出的具体案例,reqres 不是一个答案所表明的“局部变量”——它们被称为参数或自变量。你没有将任何东西传递给他们。它们由调用函数传递给您。如果愿意,您实际上可以称它们为 fredbarney,尽管这将是一个糟糕的主意。要点是它们将被调用并填充请求和响应对象。

实际上你甚至不必在你的函数签名中包含参数,你可以像下面那样有一个回调,并通过读取参数数组来使用传递给你的函数的第二个参数(注意,它实际上不是一个数组,但在许多方面表现相似)。这将是一个非常糟糕的想法,但再次尝试说明这一点。

      var http = require('http');
http.createServer(function () {
arguments[1].writeHead(200, {'Content-Type': 'text/plain'});
arguments[1].end('Hello World\n');
}).listen(1337, 'myhost');

关于javascript - Node JS 匿名函数和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22677385/

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