Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除函数中定义的超出作用域的侦听器

删除函数中定义的超出作用域的侦听器
EN

Stack Overflow用户
提问于 2014-05-30 19:19:44
回答 1查看 113关注 0票数 0

我有一个模块,必须记录我想要添加的函数。我的问题是,因为this.audio.stdout为另一个函数设置了侦听器,所以我只能删除在调用start函数时激活的侦听器,而不会搞乱其他进程。因为filename的值根据函数被调用的时间而变化,所以我必须在设置该值的范围内定义回调。这对于使用start()开始记录是有效的,但是当我调用stop()来删除侦听器时,程序不知道该做什么,因为回调超出了作用域。这样做的正确方式是什么?

代码语言:javascript
运行
AI代码解释
复制
function Record(rx) {
    this.rx = rx;
    this.audio = spawn('audio_client');
}

Record.prototype.start = function () {
    var self = this;
    self.filename= new Date().getTime()+'_'+this.rx

    function record(data) {
        console.log(self.filename);
    }
    this.audio.stdout.on('data', record);
}

Record.prototype.stop = function () {
    this.audio.stdout.removeListener('data',record);
}
EN

回答 1

Stack Overflow用户

发布于 2014-05-30 19:30:53

更新:

抱歉,我一开始没听懂你在问什么。我看了一会儿,这是我能想到的最好的了。在构造函数中为每个实例创建记录方法并不理想,但同样,这也是我能想到的最好的方法。

代码语言:javascript
运行
AI代码解释
复制
function Record(rx) {
    this.rx = rx;
    this.audio = spawn('audio_client');

    var self = this;
    this.record = function (data) {
        console.log(self.filename);
    };
}

Record.prototype.start = function () {
    this.filename= new Date().getTime()+'_'+this.rx
    this.audio.stdout.on('data', this.record);
};

Record.prototype.stop = function () {
    this.audio.stdout.removeListener('data', this.record);
};

更新#2:

更好的是,因为您是特定于节点的,所以最好是this.record = this.record.bind(this);

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

https://stackoverflow.com/questions/23961970

复制
相关文章
全局作用域、函数作用域、块级作用域的理解
ES6中新增的概念,在ES5中是没有的,ES5中没有? 没有的时候我们代码也写的好好的,现在新增的概念,我不用不行吗? 来,拋一个典型的问题出来,你就明白块级作用域出现的重要性了。
yuezhongbao
2019/02/26
3.5K0
全局作用域、函数作用域、块级作用域的理解
Rust中的作用域及作用域的规则
所有权是 Rust 最独特的特性,它使 Rust 能够在不需要 GC 的情况下保证内存安全。在本章中,我们将讨论所有权以及几个相关特性:借用/切片,以及 Rust 如何在内存中布局数据。
端碗吹水
2022/06/02
4.3K1
Rust中的作用域及作用域的规则
函数作用域和块作用域
正如上一章讨论,作用域包含了一系列的“气泡”,每一个都可以作为容器,其中包含了标识符(变量、函数)的定义,这些气泡互相嵌套并且整齐地排列成蜂窝型,排列的结构是在写代码时定义的。
Karl Du
2020/10/23
2.8K0
JavaScript中的作用域和作用域链
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。可能这两句话并不好理解,我们先来看个例子:
刘亦枫
2020/03/19
2.6K0
JavaScript中的作用域和作用域链
【说站】javascript中函数作用域的介绍
当在函数作用域中操作一个变量时,它会首先在自己的作用域中找到,如果有,它会直接使用,如果没有,它会在上一级作用域中找到,直到找到整体作用域,如果整体作用域中仍然没有,它报错ReferenceErrror。
很酷的站长
2022/11/24
4860
python的函数(二):作用域
我们在写函数时,时常需要引用全局的变量,或对全局变量赋值。又或者偶尔遇到局部变量与全局变量同名。在处理这些问题时,python语言的游戏规则是怎样的?今天我们就来学习这方面的内容。 什么是作用域? 在python语言里,在函数内部定义的变量,仅在函数内有效。在函数外面定义的变量对全局有效。我们把这种变量的有效范围叫作变量的作用域。 在python语言里,当引用变量时,会按照由内向外、由近及远的找查变量的定义及赋值。例如下面的代码: a=1 deffunc(): b=a c=a 当执行到b = a时, 第
企鹅号小编
2018/01/22
8040
python的函数(二):作用域
python中作用域与函数嵌套
实际上我们在定义函数的时候,如果省略了星号,那么在调用函数的时候必须要省略星号,除非我们拆解后的参数个数刚好相等。
刘金玉编程
2019/07/31
8690
js中的作用域
相信自从es6出来之后,你一定多少知道或者已经在项目中实践了部分的块级作用域,在函数或者类的内部命名变量已经在使用let了,但是你知道它真正的作用是什么吗?又是因为什么我们要用这个块级作用域,本文与你一起探讨块级作用域的场景以及所有细节问题。
RobinsonZhang
2018/08/28
3.7K0
Python基础语法-函数-函数的作用域
在 Python 中,函数作为代码的模块化单位,可以实现代码的重用和简化。函数具有自己的作用域,即变量的可见范围,了解函数的作用域是编写高质量代码的关键之一。
玖叁叁
2023/04/17
4400
函数与作用域
1.函数声明和函数表达式有什么区别 函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 JavaScript有三种方法,可以声明一个函数。 1.function命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面传入函数的参数。函数体放在大括号里面。 function add(s) { console.log(s) } 上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应
小胖
2018/06/27
9060
Kotlin | 作用域函数
Kotlin 标准库包含了几个特殊的函数,其目的是在调用对象的上下文环境(context)中执行代码块。当你在提供了 lambda 表达式的对象上调用此类函数时,它会形成一个临时作用域。在此作用域内,你可以在不使用其名称的情况下访问该对象,这些函数被称为作用域函数。在 Kotlin 中,作用域函数总共有五个,分别是:let、run、with、apply、also。接下来我们逐个详细分析。
SkyRiN
2019/05/14
1.1K0
JavaScript 函数作用域
作用域(scope)指的是变量存在的范围。在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域,本教程不涉及。
RiemannHypothesis
2022/10/28
3580
《你不知道的JavaScript》:函数作用域和块作用域
昨天讲到作用域,回顾下概念:作用域是一套用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找的规则。
前端_AWhile
2019/08/29
1.1K0
【Groovy】Groovy 脚本调用 ( Groovy 脚本中的作用域 | 本地作用域 | 绑定作用域 )
在 Groovy 脚本中 , 定义两个变量 , 一个使用 def 声明 , 一个直接声明变量 ;
韩曙亮
2023/03/30
1.6K0
【Groovy】Groovy 脚本调用 ( Groovy 脚本中的作用域 | 本地作用域 | 绑定作用域 )
spring中Bean的作用域
在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
MickyInvQ
2020/09/27
9450
Python基础语法-函数-函数的作用域(二)
在 Python 中,每个函数都有自己的命名空间,用于存储函数内定义的变量。变量名只在相应的命名空间中可见,因此同名变量可以存在于不同的命名空间中而不会相互干扰。
玖叁叁
2023/04/17
4020
js中扩充函数作用域(改变this指向)
GetName函数是在全局环境中定义,所以直接调用函数this就指向了全局环境,所以输出Jack。
小明爱学习
2020/07/06
2.9K0
求函数的定义域
Mathematica 10 中可以很方便的求变量为的 x 的实函数 f 的最大定义域了.
WolframChina
2018/05/31
8570
Java 中变量的作用域
变量的作用域是一个程序的重要组成部分。因为它决定了某个时候每个地方某个变量是否可访问。与 C/C++ 一样。静态语言的作用域在编译期就是确定的。而且独立于函数调用堆栈。
技术从心
2019/08/06
2.2K0
Java 中变量的作用域
Spring中bean的作用域
1、singleton作用域 当一个bean的作用域设置为singleton, Spring IOC容器只会创建该bean定义的唯一实例。 2、prototype  prototype作用域部署的bean,每一次请求都会产生一个新的bean实例,相当与一个new的操作。 3、request request表示该针对每一次HTTP请求都会产生不同的bean实例,只有在web应用中使用Spring时,该作用域有效。 4、session session作用域表示该针对每一次HttpSession请求都会产生不同的bean实例。只有在web应用中使用Spring时,该作用域有效。 5、global session 每个全局的HttpSession对应一个Bean实例。典型情况下,仅在使用portlet context的时候有效。只有在web应用中使用Spring时,该作用域有效。 6.自定义作用域 在Spring 2.0中,Spring的bean作用域机制是可以扩展的。这意味着,你不仅可以使用Spring提供的预定义bean作用域; 还可以定义自己的作用域,甚至重新定义现有的作用域(不提倡这么做,而且你不能覆盖内置的singleton和prototype作用域)。
week
2018/08/27
6650

相似问题

函数超出作用域

11

加载超出作用域的函数

45

Javascript中超出作用域的变量函数

20

函数是否超出作用域?

20

getJSON成功函数超出作用域

21
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档