当前位置 : 主页 > 网页制作 > JQuery >

jQuery / JavaScript函数范围/提升

来源:互联网 收集:自由互联 发布时间:2021-06-15
我有两个包含 JavaScript和jQuery函数的文件.它们按此顺序在页面上引用: script src="js/kiosk-functions.js"/scriptscript src="js/kiosk-main-socket-handler.js"/script 在kiosk-functions.js我最初这样做了 – $(func
我有两个包含 JavaScript和jQuery函数的文件.它们按此顺序在页面上引用:

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

网友评论