在Javascript中将全局变量传递给事件回调函数?

在Javascript中将全局变量传递给事件回调函数?,javascript,node.js,scope,eventemitter,Javascript,Node.js,Scope,Eventemitter,在下面的代码中,我试图将mydata传递给回调函数。这是我遇到的一个更大问题的一个样本问题。我假设这是一个范围问题。我的代码有什么问题和/或我应该怎么做 var EventEmitter = require('events').EventEmitter; var myevent = new EventEmitter(); var mydata = 'my data!'; function myfunc (data, mydata) { console.log(data

在下面的代码中,我试图将
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!

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

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

要么:

  • 更改参数的名称,或
  • 删除该参数,或
  • 传递所需的值,例如,
    myevent.emit('data','data!',mydata)
  • p、 s:

    最好写为:

    myevent.on('data', myfunc);
    

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

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

    要么:

  • 更改参数的名称,或
  • 删除该参数,或
  • 传递所需的值,例如,
    myevent.emit('data','data!',mydata)
  • p、 s:

    最好写为:

    myevent.on('data', myfunc);
    

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

    如果是这种情况,那么您没有将任何内容传递给第二个回调参数,这就是为什么它以
    undefined
    的形式出现。请尝试以下方法:

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

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

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

    如果是这种情况,那么您没有将任何内容传递给第二个回调参数,这就是为什么它以
    undefined
    的形式出现。请尝试以下方法:

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

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

    修改的代码:您可以访问全局变量。从任何地方都不需要将其作为参数传递。即使你传递了一个参数。您可以使用
    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!");
    

    修改代码:您可以访问全局变量。从任何地方都不需要将其作为参数传递。即使你传递了一个参数。您可以使用
    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!");
    

    您应该避免将局部变量和全局变量命名为相同的名称,因为它们会相互遮挡并导致混淆。如果变量是全局变量(或者如果
    myfunc
    可以通过闭包访问它),为什么要“传递”呢是吗?@bfavaretto我试图模拟我遇到的一个更大的问题,我认为这是一个与事件流和socket.io不同的范围问题。我已经了解到,我的event-stream.pipepline.emit应该发出socket.io套接字,这样我就可以执行socket.emit(data),这是一个完全不同的问题。你应该避免将局部变量和全局变量命名为相同的名称,因为它们会相互隐藏并导致混淆。如果变量是全局变量(或者如果
    myfunc
    可以通过闭包访问它),你为什么要“传递”它?@bfavaretto我试图模拟一个更大的问题,我认为它与事件流和socket.io的作用域问题不同。我已经了解到我的event-stream.pipepline.emit应该发出socket.io套接字,这样我就可以执行socket.emit(data),这是一个完全不同的问题。在emit call3上传递参数。将参数传递给emit call,您是对的。我起草了这个简单的例子(如果命名的话,选择错误),因为我想在我的事件流发出数据时使用socket.io来发出数据,发出相同的数据。你是对的。我起草了这个简单的例子(如果命名的话,选择错误),因为我想在我的事件流发出数据时使用socket.io来发出数据,发出相同的数据。