为什么 JQuery 全局对象在 JavaScript 函子中无法访问

Why JQuery global object is not accessible in javascript functon?

本文关键字:访问 JavaScript JQuery 全局 对象 为什么      更新时间:2023-09-26

请参阅下面的片段:

var mySwiper = new $('.swiper-container').swiper({
    pagination: '.pagination',
    loop:true,
    grabCursor: true,
    paginationClickable: true
});
function moveslide(n) {
    alert(mySwiper)
}

在警报中,它显示"未定义"我不知道为什么? mySwiper是全局的,它在同一块中不起作用!

请指导。

在评论中,你说过

  • 去除new没有区别,并且

  • 您通过单击按钮呼叫moveslide

这告诉我们这是三件事之一:

  1. 您在var mySwiper = ...行执行之前调用moveslide。由于var声明发生在上下文中的任何分步代码之前 [它们被"提升"]),因此变量存在,但由于该行上的赋值保留在原处,因此可以在mySwiper获取分配给它的值之前调用moveslide

  2. mySwiper值分配的代码可能永远不会被调用。我会在上面放一个断点,看看它是否确实如此;也许错误(异常或逻辑错误)会阻止在分步执行中访问代码。这不会影响moveslide(函数声明像var一样被提升),但会影响分配给变量的代码。

  3. (这只有在没有var mySwiper = new ...行上的new的情况下才有可能).swiper()返回undefined 。对于 jQuery 插件来说,这将是一件非常奇怪的事情,如果你甚至在使用 new 时也有问题,那么这不是它,但我只是为了完整性而包含它。

    旁注:为什么new不能发生这种情况?因为对于new,表达式的结果将始终是非空对象引用,而不是原始对象:new创建一个对象,然后调用您提供给它的函数,该对象可用作this。如果函数不返回任何内容、返回 null 或返回任何基元值(包括 undefined),则 new 表达式的结果是对 new 创建的对象的引用;如果函数返回非 null 对象引用,则结果是该对象引用。所以你永远无法从new中得到undefined.


旁注:从您的问题来看,您似乎认为这是一个范围问题,并困惑为什么mySwiper不在范围内。这不符合症状。如果您在alert中看到undefined,则mySwiper在范围内;如果它不在范围内,你会得到一个ReferenceError(因为尝试读取不存在的变量的值是一个错误)。我只是提到这一点,以便如果您以后遇到类似的事情,您就会知道这不是范围,而是时间。

在页面顶部,document.ready函数内部声明如下内容:

var mySwiper; //making it global

并更改代码,如下所示(仅删除var):

mySwiper = new $('.swiper-container').swiper({
    pagination: '.pagination',
    loop: true,
    grabCursor: true,
    paginationClickable: true
});
function moveslide(n) {
    alert(mySwiper)
}