为什么在javascript函数中无法访问JQuery全局对象?

时间:2014-11-18 10:49:03

标签: javascript jquery

请参阅下面的代码段:

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

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

请指导。

2 个答案:

答案 0 :(得分:2)

在评论中,你已经说过了

  • 删除new没有任何区别,

  • 您是通过点击按钮

  • 来呼叫moveslide

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

  1. 您在执行moveslide行之前正在调用var mySwiper = ... 。因为var声明在上下文中的任何分步代码之前发生[它们被“悬挂”]),所以变量存在,但因为该行上的赋值保留在它的位置是的,可以在moveslide为其分配值之前致电mySwiper

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

  3. (只有 {}> new var mySwiper = new ... .swiper() undefined new才能返回new。对于jQuery插件来说,这将是一个非常奇怪的事情,如果你在new时遇到问题,那么这不是它,但我只是将它包括在内完整性。

    旁注:new为什么不能发生这种情况?因为使用this,表达式的结果将始终是非空对象引用,而不是原语:null创建一个对象,然后调用您为该对象提供的函数{{{1} 1}}。如果函数没有返回任何内容,返回undefined或返回任何原始值(包括new),new表达式的结果是对{{{{}创建的对象的引用1}};如果函数返回非空对象引用,则结果是该对象引用。因此,您永远无法从undefined返回new


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

答案 1 :(得分:-1)

在页面顶部,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)
}