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,这帮助了我理解我的套接字变量不正确的原因。谢谢。我完全没有理解。