我有两个包含 JavaScript和jQuery函数的文件.它们按此顺序在页面上引用: script src="js/kiosk-functions.js"/scriptscript src="js/kiosk-main-socket-handler.js"/script 在kiosk-functions.js我最初这样做了 – $(func
<script src="js/kiosk-functions.js"></script> <script src="js/kiosk-main-socket-handler.js"></script>
在kiosk-functions.js我最初这样做了 –
$(function() {
// some JavaScript functions
function isJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
// some jQuery code follows...
});
然后,在kiosk-main.js我有这个 –
$(function() {
var socket = io();
socket.on('message', function (data) {
if(isJSON(data)) {
// do stuff
}
});
// other JavaScript and jQuery code
});
这导致以下错误 –
Uncaught ReferenceError: isJSON is not defined
一旦我将isJSON()函数移出kiosk-functions.js中的文档就绪处理程序,那么一切都很顺利,但让我感到困惑.我在这里阅读了许多答案,试图了解正在发生的事情,并认为该功能将被提升并在全球范围内可用.我没有找到任何证明这个例子的东西.
我确信我在这里缺少一些简单的东西.文档就绪处理程序(一个函数)是否保持isJSON()函数不被提升?或者这是一个简单的范围问题?
你的问题不是悬挂,而是功能的范围.基本上在kiosk-functions.js中你定义了一个对document.ready的回调,在你的回调中你定义了函数isJSON().该功能在该范围内是已知的.
在第二个文件kiosk-main.js中,您尝试使用isJSON(),就好像它是在该回调的范围或全局范围中定义的一样.两者都不是这样,因此错误.
为了解决这个问题,你可以添加一些全局命名空间myNamespace并在那里附加你的函数:
$(function() {
// some JavaScript functions
function isJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
// init namespace
window.myNamespace = window.myNamespace || {};
// attach function
window.myNamespace.isJSON = isJSON;
});
然后在另一个文件中,您可以引用该全局命名空间来调用您的函数:
$(function() {
var socket = io();
socket.on('message', function (data) {
if(myNamespace.isJSON(data)) {
// do stuff
}
});
// other JavaScript and jQuery code
});
编辑
正如@Alnitak在评论中所提到的:在浏览器中,全局对象是窗口.相应地更改了代码.
