2014-08-30 85 views
0

我已经有一些Node.js在jQuery的文档中准备了一些函数。我有两个文件都准备好了文件。但是,一个文件调用另一个文件,并且它不识别该功能。 ReferenceError:SocketGameOut未定义Javascript/JQuery范围问题

=========== File 1 ============= 

$(document).ready(function() { 

var socket = io.connect('http://local.baseball.com:3333'); 

socket.on('news', function (data) { 
    SocketBroadcastIn(data); 
}); 

socket.on('message', function (data) { 
    SocketGameIn(data); 
}); 

function SocketGameOut(outstring) { 
    socket.emit('clientData', outstring); 
} 

}); 

============ File 2 ============== 

$(document).ready(function() { 

    $("#login").click(function() { 

    var loginData = { command: 'login', user: $("#user").val(), pass: $("#password").val() } 
    var data = JSON.stringify(loginData); 

    SocketGameOut(data); <--This function call returns 
       ReferenceError: SocketGameOut is not defined 

}); 

}); 
+0

最简单的办法会是使SocketGameOut成为全局的。例如,在file1中,在'document.ready'中的最后一个东西,放置'window.SocketGameOut = SocketGameOut'。 – 2014-08-30 20:27:49

回答

1

函数遵循与变量相同的作用域规则(实际上函数是变量)。所以如果你在另一个函数中创建一个函数,它将只在该函数中可见。

在第一个文件中,您不需要$(document).ready事件,因为您不操作DOM。只需将其删除并在全局范围内创建变量即可,因此它们将在文件1的其他部分以及所有文件中都可见,包括在本文后。

另一种方法是此功能附加到一个变量$(document).ready外面,所以这将是在全球范围内,但没有必要在这里和第一种方式会更好:

var SocketGameOut; 
$(document).ready(function() { 
    //your code... 
    SocketGameOut = function (outstring) { 
     socket.emit('clientData', outstring); 
    } 
    //your code... 
}); 
+0

+1,简洁的答案。 – 2014-08-30 20:30:07

+0

谢谢,像一个魅力工作! – 2014-08-30 20:31:35