Javascript Node.js模块级变量未定义

Javascript Node.js模块级变量未定义,javascript,node.js,scope,Javascript,Node.js,Scope,我在从所述模块内的函数访问模块级变量的范围时遇到问题。见下文 var socketio = require('socket.io'); var socket = socketio.listen(); var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080'); socket.on('connection', function connection(socket) { socket.emit('

我在从所述模块内的函数访问模块级变量的范围时遇到问题。见下文

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {

    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    myCustomModule.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};
var socketio=require('socket.io');
var socket=socketio.listen();
var myCustomModule=require('./lib/myCustomModule')('http://mysite:8080');
socket.on('connection',函数连接(socket){

socket.emit('message',{data:'test1'});这是因为您在socket.on('init')中使用了异步事件,这导致了范围问题。我相信如果您从父级传入要使用的参数,它将起作用。例如:

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {
    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule(socket, myCustomModule);
    });

});

var refreshMyCustomModule = function(socket, module) {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    module.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};
var socketio=require('socket.io');
var socket=socketio.listen();
var myCustomModule=require('./lib/myCustomModule')('http://mysite:8080');
socket.on('connection',函数连接(socket){

socket.emit('message',{data:'test1'});这是因为您在socket.on('init')中使用了异步事件,这导致了范围问题。我相信如果您从父级传入要使用的参数,它将起作用。例如:

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {
    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule(socket, myCustomModule);
    });

});

var refreshMyCustomModule = function(socket, module) {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    module.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};
var socketio=require('socket.io');
var socket=socketio.listen();
var myCustomModule=require('./lib/myCustomModule')('http://mysite:8080');
socket.on('connection',函数连接(socket){

emit('message',{data:'test1})请注意,脚本全局级别的
socket
函数连接中的
socket
是两个不同的变量。
函数连接中的变量是从连接事件传递到该函数的参数。中使用的变量e> refreshMyCustomModule
是全局模块,您在其中调用了
listen

如果我们更改它们的名称,这一点会更清楚,因为它们是不同的变量:

var socketio = require('socket.io');
var socketUsedForListen = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socketUsedForListen.on('connection', function connection(socketFromConnection) {

    socketFromConnection.emit('message', {data:"test1"});

    socketFromConnection.on('init', function init(data) {

        socketFromConnection.emit('message', {data:"test1"});

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socketUsedForListen.emit('message', {data:"test1"});

    myCustomModule.beginSomeAsyncTask(function(data) {

         socketUsedForListen.emit('message', {data:"test2"});

    });

};

我相当确定您打算在
refreshMyCustomModule
中使用
socketFromConnection
,而不是
socketUsedForListen
。如果是这样,请将
refreshMyCustomModule
移动到连接回调中,或者将套接字作为参数传递给它。

注意,
socket
函数连接中的脚本和
套接字是两个不同的变量。
函数连接中的变量是从连接事件传递到该函数的参数。
refreshMyCustomModule中使用的变量是全局变量,在你打电话给我听

如果我们更改它们的名称,这一点会更清楚,因为它们是不同的变量:

var socketio = require('socket.io');
var socketUsedForListen = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socketUsedForListen.on('connection', function connection(socketFromConnection) {

    socketFromConnection.emit('message', {data:"test1"});

    socketFromConnection.on('init', function init(data) {

        socketFromConnection.emit('message', {data:"test1"});

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socketUsedForListen.emit('message', {data:"test1"});

    myCustomModule.beginSomeAsyncTask(function(data) {

         socketUsedForListen.emit('message', {data:"test2"});

    });

};

我相当确定您打算在
refreshMyCustomModule
中使用
socketFromConnection
,而不是
socketUsedForListen
。如果是这样,请将
refreshMyCustomModule
移动到连接回调中,或者将套接字作为参数传递到其中。

作用域规则相同。JavaScript、语言、def范围规则。NodeJ和浏览器,环境,不。范围规则是相同的。JavaScript,语言,定义范围规则。NodeJ和浏览器,环境,不。这帮助我理解了为什么我的套接字变量不正确。谢谢。我完全错过了这一点。+1@T.J.Crowder,这帮助了我理解我的套接字变量不正确的原因。谢谢。我完全没有理解。