【问题标题】:Pass global variable to on event callback function in Javascript?将全局变量传递给Javascript中的事件回调函数?
【发布时间】:2012-09-27 00:10:31
【问题描述】:

在下面的代码中,我试图将mydata 传递给回调。这是我遇到的一个更大问题中的一个示例问题。我假设这是一个范围问题。我的代码有什么问题和/或我应该怎么做?

var EventEmitter = require('events').EventEmitter;
var myevent      = new EventEmitter();
var mydata       = 'my data!';

function myfunc (data, mydata) {
  console.log(data);
  console.log(mydata);
};

myevent.on('data', function(data, mydata) {myfunc(data,mydata)});

myevent.emit('data', "data!");

返回:

data!
undefined

我希望它返回:

data!
my data!

【问题讨论】:

  • 您应该避免将局部变量和全局变量命名为相同的名称,因为它们会相互影响并造成混淆。
  • 如果变量是全局变量(或者如果myfunc 可以通过闭包访问它),为什么要“传递”它?
  • @bfavaretto 我试图模拟一个更大的问题,我认为这是 event-stream 和 socket.io 的不同范围问题。我了解到我的 event-stream.pipepline.emit 应该发出 socket.io 套接字,以便我可以执行 socket.emit(data),这完全是一个不同的问题。

标签: javascript node.js scope eventemitter


【解决方案1】:

修改后的代码:您可以访问全局变量。从您不需要将其作为参数传递的任何地方。即使你传递一个参数。您可以使用 window.mydata 访问全局变量,因为您使用的是 nodejs 您可以使用 global.mydata 访问全局变量

var EventEmitter = require('events').EventEmitter;
var myevent      = new EventEmitter();
var mydata       = 'my data!';

function myfunc (data) {
  console.log(data);
  console.log(mydata);
};

myevent.on('data', myfunc);

myevent.emit('data', "data!");

【讨论】:

    【解决方案2】:

    我来做个疯狂的猜测(因为我不熟悉EventEmitter)并说emit的第一个参数是事件的名称,其余参数传递给处理程序。

    如果是这种情况,您不会向第二个回调参数传递任何内容,这就是它以undefined 出现的原因。试试这个:

    myevent.emit('data', "data!", "mydata!");
    

    注意:我忽略了您的阴影问题,因为它与问题无关,只是一种不好的做法。

    【讨论】:

    • 你是对的。我从一个问题中绘制了这个简单的示例(如果命名则选择错误),每当我的事件流发出数据时,我想使用 socket.io 发出数据,发出相同的数据。
    【解决方案3】:

    回调的参数列表中的参数mydata隐藏了同名的全局变量。

    由于您在该位置未传递任何参数,因此其值为undefined

    要么:

    1. 更改参数名称,或
    2. 删除参数,或
    3. 传递所需的值,例如myevent.emit('data', "data!", mydata);

    ps:

    myevent.on('data', function(data, mydata) {myfunc(data,mydata)});
    

    最好写成:

    myevent.on('data', myfunc);
    

    【讨论】:

    • 3.在发出调用时传递参数
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多