我有两个包含 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在评论中所提到的:在浏览器中,全局对象是窗口.相应地更改了代码.