Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >JavaScript回调的效率

JavaScript回调的效率
EN

Stack Overflow用户
提问于 2012-04-14 20:19:59
回答 2查看 287关注 0票数 2

我只是想确认一下对我的怀疑。

我偶然发现了一篇文章,推荐按以下方式使用Socket.io:

代码语言:javascript
代码运行次数:0
复制
var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
    socket.on('action1', function (data) {
        // logic for action1
    });

    socket.on('action2', function (data) {
        // logic for action2
    });

    socket.on('disconnect', function(){
        // logic for disconnect
    });
});

我觉得以下是更好的资源利用方式:

代码语言:javascript
代码运行次数:0
复制
var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
    socket.on('action1', action1);
    socket.on('action2', action2);
    socket.on('disconnect', disconnect);
});

function action1(data) {
    // logic for action1
}

function action2(data) {
    // logic for action2
}

function disconnect() {
    // logic for disconnect
}

我的感觉是,尽管处理connection事件的匿名函数只在内存中创建一次,但处理action1action2disconnect的匿名函数是为每个套接字连接在内存中创建的。第二种方法的问题是socket不再在范围内。

那么,首先,我对创建函数的怀疑是真的吗?其次,如果是这样的话,是否有一种方法可以将socket放在命名函数的作用域中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-14 20:38:29

使用闭包有助于保持作用域的整洁:

代码语言:javascript
代码运行次数:0
复制
io.sockets.on('connection', function () {
    function action1(data) {
        // logic for action1
    }
    function action2(data) {
        // logic for action2
    }
    function disconnect() {
        // logic for disconnect
    }
    return function (socket) {
        socket.on('action1', action1);
        socket.on('action2', action2);
        socket.on('disconnect', disconnect);
    }
}()); // <- note the immediate function call 

回答您的问题:

那么,首先,我对函数创建的怀疑是真的吗?

是。上面的闭包方法避免了这种情况,回调函数只创建一次。另外:所有都可以看到正确的父作用域。

,其次,如果是这样的话,有没有一种方法可以将socket放在命名函数的作用域中?

socket将在回调中以this的形式提供。

票数 5
EN

Stack Overflow用户

发布于 2012-04-14 20:30:05

您说得对,匿名方法是为每个连接创建的-如果您不需要作用域,那么第二个方法就可以避免这种情况。如果您需要套接字作用域,没有真正的方法可以避免它。如果您希望将方法保留在外部(出于某些其他原因),并且仍然保留作用域,则始终可以:

代码语言:javascript
代码运行次数:0
复制
//...
socket.on('action1', function(){
  action1.apply( socket, arguments );
} );
//... and so forth.

但是这会让你重新为每个连接创建一个方法签名,所以我不确定你会得到什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10157063

复制
相关文章
JavaScript回调函数
JavaScript中的回调函数是一种特殊类型的函数,它被传递给其他函数作为参数,并在特定的事件或条件发生时被调用。回调函数用于处理异步操作、事件处理、定时器等情况,以确保代码在合适的时机执行。在JavaScript中,回调函数常用于处理非阻塞的操作,以避免程序的停顿和等待。
堕落飞鸟
2023/05/17
2.5K0
JavaScript 回调函数
函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回;
鱼找水需要时间
2023/02/16
2.8K0
JavaScript回调函数
JavaScript API里这样解释:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. (回调是一个函数作为参数传递给另一个函数,其母函数完成后执行。) 使用回调函数的原因:可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
奋飛
2019/08/15
2.3K0
javaScript回调函数
回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
用户6167509
2019/09/04
3.6K1
JavaScript回调函数
JavaScript的回调函数大概是JavaScript中使用最广泛的函数编程技术了,我们几乎可以在任何脚本中看到它的身影。
wade
2020/04/23
1.6K0
javascript异步中的回调
我们之前介绍了javascript异步的相关内容,我们知道javascript以同步,单线程的方式执行主线程代码,将异步内容放入事件队列中,当主线程内容执行完毕就会立即循环事件队列,直到事件队列为空,当用产生用户交互事件(鼠标点击,点击键盘,滚动屏幕等待),会将事件插入事件队列中,然后继续执行。 处理异步逻辑最常用的方式是什么?没错这就是我们今天要说的---回调
陌上寒
2019/04/02
2.1K0
javascript异步中的回调
JavaScript-回调函数
In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time
小小工匠
2021/08/16
9350
JavaScript中的回调函数(callback)
被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。
刘亦枫
2020/03/19
7.1K0
asp.net回调javascript
using System; using System.Collections; using System.IO; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; namespace Platform {  /// <summary>  /// 可以处理客户端的jscript的回调  //
阿新
2018/04/09
7210
javascript基础之回调函数
回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
wfaceboss
2019/04/08
8550
如何深度理解JavaScript的回调函数
我们知道,JavaScript他不是一个面向对象语言,但是,我们的JavaScript是一个基于对象的脚本语言。
JanYork_简昀
2022/05/25
1.3K0
如何深度理解JavaScript的回调函数
JavaScript中的this指针与回调函数
在常规的面向对象语言中(比如C++),this指针的指向是确定的。但在JavaScript中,this指向依赖于运行环境。
coderhuo
2023/10/21
1820
JavaScript基础——回调(callback)是什么
上篇文章《JavaScript基础——你真的了解JavaScript吗?》,我们明白了JavaScript是一个单线程、非阻塞、异步、解释性语言,清楚了什么是单线程、进程、阻塞、调用堆栈、异步回调、任
前端达人
2018/12/02
1.6K0
JavaScript基础——回调(callback)是什么
JavaScript系列之回调函数callback
听起来似乎有点不好理解,所以还是举例进行说明,介绍回调函数之前先简单说明一下同步和异步,前端也有同步和异步。同步和异步总得来说,两者最明显的区别就是是否需要等待,如果是串行执行的就是同步机制,是并行执行的就是异步机制,这个比较好理解
SmileNicky
2020/01/13
8650
深入理解 JavaScript 回调函数 [每日前端夜话0xDF]
JavaScript 回调函数是成为一名成功的 JavaScript 开发人员必须要了解的一个重要概念。但是我相信,在阅读本文之后,你将能够克服以前使用回调方法遇到的所有障碍。
疯狂的技术宅
2019/11/14
1.7K0
有关JavaScript中回调函数的所有内容!
最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。
前端小智@大迁世界
2021/01/18
2.2K0
【说站】javascript回调函数的异步探究
1、JavaScript代码本质上总是阻塞的。但是这种阻塞性使我们无法在某些情况下编写代码。
很酷的站长
2022/11/23
9810
【说站】javascript同步回调如何理解
以上就是javascript同步回调的理解,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/24
5660
【说站】javascript异步回调是什么
1、异步回调在执行高阶函数之后执行。是非阻塞的:高阶函数无需等待回调即可完成其执行,高阶函数可确保稍后在特定事件上执行回调。
很酷的站长
2022/11/24
6220
点击加载更多

相似问题

回调中的Javascript回调

14

JavaScript -回调()与回调

10

Underscore.js封装回调效率

21

回调中的JavaScript/NodeJS回调

10

Javascript回调

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文