Node JS 匿名函数和回调

2024-01-12

请有人帮助我。我阅读了大量的 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 内部的某个地方。它们没有在任何地方声明!它们由引用内部对象或其他内容的匿名函数中的变量名组成。这很疯狂。

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

or like

          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)

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

实际上,您甚至不必在函数签名中包含参数,您只需进行如下回调,并通过读取参数数组来使用传递给函数的第二个参数(注意,它实际上不是一个数组,而是在许多方面表现相似)。这将是一个非常非常糟糕的想法,但我再次试图说明这一点。

      var http = require('http');
      http.createServer(function () {
             arguments[1].writeHead(200, {'Content-Type': 'text/plain'});
             arguments[1].end('Hello World\n');
      }).listen(1337, 'myhost');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node JS 匿名函数和回调 的相关文章

  • .getDay() 奇怪的行为[重复]

    这个问题在这里已经有答案了 有一个例子 console log new Date 2013 02 24 getDay 24 gt 0 24 console log new Date 2013 02 25 getDay 25 gt 1 25
  • Mocha / Chai Expect.to.throw 未捕获抛出的错误

    我在获取 Chai 时遇到问题expect to throw测试我的 node js 应用程序 测试在抛出的错误上不断失败 但是如果我将测试用例包装在 try 和 catch 中 并对捕获的错误进行断言 它就会起作用 Does expect
  • 带有 socket.io 的 Node.js 服务器可同时处理 50000 个客户端

    我们正在开发一个 Javascript 控件 它应该不断连接 到服务器以接收动画更新 我们计划将这些东西托管在亚马逊云上 场景是这样的 服务器连接到 activemq 队列等待更新 对于每个更新 它都会将其广播到所有连接的客户端 是否可以使
  • 如果只有一个元素发生变化,为什么 AngularJs 会更新数组/哈希映射的所有元素?

    我有一个简单的哈希图和一个以文本形式显示状态的简单方法 但是当我仅更新 1 个用户状态时 所有这些状态都会更新 为所有用户调用函数 有没有一种方法可以只更新一个元素而不是全部 示例代码在这里 只需看看当您单击 更改状态 按钮时控制台中会发生
  • Java HttpURLConnection:内容长度计算

    我目前正在为 bitbucket issues RESTful API 开发一个库 我取得了很大的进步 现在我要解决这个部分更新问题 http confluence atlassian com display BBDEV Issues Is
  • node.js、vue.js 和express.js 堆栈开发

    我正在尝试使用 Linux 上的 Visual Studio Code IDE 使用 vue js express js 和 node js 创建一个 Web 应用程序 根据网上的一些文档 我读到安装 vue js 后 可以创建一个vue
  • 不明白为什么 Chrome/Safari 无法在此处获取 ScrollHeight

    我只是问了一个问题 为什么某些 js 代码不能 100 在 Chrome 和 Safari 中工作 但经过更多故障排除后 我想我发现这是我应该发布的问题 我有一个页面 其中有一个表单 该表单的目标是同一页面上的 iframe iframe
  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • 解密Javascript源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经编写了一段 JavaScrip
  • 删除 CSS Transitionend 事件侦听器不起作用

    我在尝试删除 css Transitionend 事件侦听器时遇到问题 我可以添加监听器 e addEventListener transitionend function event transitionComplete event pr
  • 如何为 chrome 和 ie favicon(加载指示器)设置动画

    我的 PM 有一个要求 将图标更改为动画加载图像 仅当我将 link href 指向 gif 文件时 它才适用于 Firefox 我做了一些研究 发现 chrome 不支持动画图标 但wiki https en wikipedia org
  • everyauth 承诺是什么?

    我不明白 everyauth 承诺是什么 我发现我需要返回一个 Promise 对象或用户 但是 everyauth Promise 是什么 当您有一个执行身份验证但异步执行的函数时 它非常有用 您不能直接从函数返回用户信息 因为您必须等待
  • 在没有全局变量的情况下对多个事件使用 Promise 回调

    我有一个包含在函数中的承诺 我将使用不同的输入参数多次调用该函数 每次承诺解决时 我都会将解决的值推送到存储数组中 当我所有的调用承诺都得到解决后 我将在其他函数中使用这个存储数组 是否有任何干净的方法可以在不使用 全局 变量的情况下进行设
  • 如何在 ES6 类中使用静态变量?

    我正在尝试在 es6 中使用静态变量 我想声明一个静态变量count in Animal类并增加它 但是 我无法通过声明静态变量static count 0 所以我尝试了另一种方法 class Animal constructor this
  • 如何使用 jQuery AJAX 和 JSON 通过 Bootbox 确认表单提交

    我正在使用一个网络应用程序工作Spring MVC 我试图在提交表单之前显示一个确认对话框Bootbox 但我收到 500 内部服务器错误 这是我的表格
  • 如何在 Android 设备(平板电脑和手机)方向更改时获得正确的窗口宽度

    我正在尝试使用 jquery 函数计算 Android 设备方向变化时的窗口宽度 window outerWidth true 此计算给出了两个方向变化的正确宽度iphone and ipad但在安卓中不行 如果我最初以横向模式或纵向模式加
  • Ruby 数组到 Javascript 数组

    我有一个带有帐户 ID 的 Ruby 数组 我想将帐户 ID 的 Ruby 数组存储在 Javascript 数组中 我想知道最好的方法是什么 另外 当我尝试执行此操作时 Javascript 似乎认为如果只输入一个帐户 ID 则该 ID
  • 如何使用 Browserify 获取 html 模板

    我正在尝试找出一种简单的方法 在脚本中需要 html 模板 然后从 CLI 运行 browserify 假设我想获取一个模板并将其附加到正文中 index js var template require template html docu
  • 获取不正确的日期,将时间戳转换为新日期

    我正在尝试将时间戳转换为日期 但得到的日期不正确 我正在开发一个使用 Angular 和 Typescript 的项目 我有这样的时间戳 1451642400 2016年1月1日 和1454320800 2016年2月1日 如果我编码 da
  • 如何通过 jQuery onblur 提交表单

    所以我尝试通过 jQuery onblur 提交表单 即一旦焦点离开密码字段 表单就会通过 jQuery 提交 有类似的问题 但这不是我要找的 我尝试使用 document getElementById 但它不起作用 任何帮助表示赞赏 提前

随机推荐

  • UITableViewCelldrawInRect iOS7

    您好 我正在尝试使用以下代码在 iOS 7 中的 UITableViewCell 中绘制字符串 void drawRect CGRect rect super drawRect rect CGRect playerNameRect CGRe
  • 我可以严格评估 Java 中存储为字符串的布尔表达式吗?

    我希望能够计算存储为字符串的布尔表达式 如下所示 hello goodbye 100 lt 101 我知道已经有很多这样的问题了 但我问这个问题是因为我已经尝试过这个问题最常见的答案 豆壳 http www beanshell org 并且
  • 如何在添加 endIgnoringInteractionEvents 之前匹配 beginIgnoringInteractionEvents

    我正在使用这两个功能 UIApplication sharedApplication beginIgnoringInteractionEvents and UIApplication sharedApplication endIgnorin
  • BigQuery 连接三个表

    我正在尝试连接 BigQuery 中的三个表 表 1 有一个事件的记录 即每一行是一条记录 表 2 有第二个事件的记录 表 3 有类别名称 我想要生成一个最终表 其中包含按类别和设备平台划分的表 1 和表 2 的计数 但是 每次我运行此命令
  • 将烧瓶 send_file (ajax 响应)中的图像显示到图像标记中

    如何显示来自烧瓶 send file ajax 响应的图像 HTML 文件
  • sqlite 列中的条件值

    我的 sqlite 表中有两个整数列 a and b 我需要创建第三列 c 其中应该包含Y if a b mod 2 1 or N如果前面的条件不满足 我不确定如何在查询中使用条件值定义这样的列 您可以在查询中轻松执行此操作 select
  • 如何在 gdb 中 fork() ed 的不同进程之间切换?

    我正在调试这样一个多进程应用程序 我怎样才能在fork 编辑流程 您可以让子进程进入睡眠状态 然后将一个新的 GDB 实例附加到它 这GDB用户手册 http sourceware org gdb current onlinedocs gd
  • 在 SSRS 查询字符串中传递多值参数的值

    我有两个使用 SSRS 2005 构建的报告 第一个报告设置为在单击特定字段时导航到第二个报告 我在文本框的 跳转到 URL 属性中使用类似于以下内容的表达式 javascript void window open http server
  • 如何下载需要用户名和密码的网页?

    例如 我想在插入用户名和密码后下载此页面 http forum ubuntu it org 我尝试过 wget 但不起作用 有 python 的解决方案吗 您可以使用这些用户名和密码进行测试 username johnconnor pass
  • GetView 与。自定义 CursorAdapter 中的 BindView?

    所以我正在看这个视频http www youtube com watch v N6YdwzAvwOA http www youtube com watch v N6YdwzAvwOARomain Guy 正在展示如何使用getView 方法
  • 创建从 C 到 C# 的混合模式 C++ 桥接器?

    我希望有人能帮助我解决这个问题 我主要是一名 C 开发人员 所以我的 C和C 技能很差 我有一个本机 C dll 它是一个插件 更大的应用 我在Linux上为Windows交叉编译这个dll 使用海湾合作委员会 在本机 dll 中 当我创建
  • 资产文件夹中的 Pdf 文件无法在第三方应用程序中打开

    你好 我是 android 新手 我有一些 PDF 文件存在于该路径中asset pdf example pdf 当我尝试使用此代码创建 PDF 文件时 Intent intent new Intent Intent ACTION VIEW
  • 如何动态构建 Perl 正则表达式?

    我有一个 Perl 脚本 它使用 File Next files 遍历目录层次结构 它只会返回以 avi flv mp3 mp4 和 wmv 结尾的脚本文件 它还会跳过以下子目录 svn 和任何以 frames 结尾的子目录 这是在file
  • 带 PyGTK 崩溃的多线程 Gstreamer (xcb_xlib_threads_sequence_lost)

    我知道不应该从其他线程更新 UIgtk 或面临后果 但我不确定在使用时如何避免这种情况gstreamer 我的应用程序在视频流初始化期间有时会崩溃 并出现以下投诉 xcb Unknown sequence number while proc
  • 处理对象字段验证的最佳方法 => Either / Try (scala 2.10) / ValidationNEL (scalaz)

    让我们假设一个使用构建器模式构造的对象 这个构建器模式将包含一个build方法侧重于字段验证 然后转换为目标类型 该验证可以使用以下方式实现 Either FailureObject TargetObject type Try Target
  • CSS 冲突样式表

    我有两个样式表 它们在几个方面相互冲突 因为我使用 5 个 6 个 有时甚至 9 个或 10 个完整的插件 每个插件都有三四个样式表 以及我自己的样式表 所以到处都会出现冲突 解决这个问题的最佳方法是什么 是进入并修改所有插件的选择器的唯一
  • Delayed_jobs 保存已完成的作业

    是否有一个参数可以传递给delayed job 以防止它从delayed jobs 表中删除已完成的作业 有点像destroy failed jobs但对于已完成的工作 有任何想法吗 扩展 jefflunt的答案 我添加了一个迁移来创建一个
  • 检查文本框是否为空

    我有一个文本框 我想检查它是否为空 哪种方式更好 if TextBox Text Length 0 or if TextBox Text 你应该使用String IsNullOrEmpty https msdn microsoft com
  • 即使使用 Polyfill,IE 也不支持 forEach。

    我已将 forEach polyfill 添加到 JavaScript 文件的顶部 但 Internet Explorer 仍然说它不支持该功能 我基本上想循环 querySelector 的结果 但是我确实在脚本中的一些其他数组对象上使用
  • Node JS 匿名函数和回调

    请有人帮助我 我阅读了大量的 javascript 文档并摆弄了 javascript 我能够使用这些函数 但我不太明白这里的基本句法爵士乐 var http require http http createServer function