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

时间:2012-10-05 19:40:14

标签: 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);
  console.log(mydata);
};

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

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

返回:

data!
undefined

我希望它能够回归:

data!
my data!

3 个答案:

答案 0 :(得分:5)

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

在该位置没有传递任何参数时,其值为undefined

或者:

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

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

    会更好地写成:

    myevent.on('data', myfunc);
    

答案 1 :(得分:3)

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

如果是这种情况,则不会将任何内容传递给第二个回调参数,这就是undefined的原因。试试这个:

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

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

答案 2 :(得分:2)

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