现有函数未定义

existing function is undefined

本文关键字:未定义 函数      更新时间:2023-09-26

我正在使用一个hammer.js库:http://hammerjs.github.io/并使用其jQuery插件。很少有像"左右按"这样的ivent可以在出现时调用函数。我正在尝试调用cardSwipe(..)函数,但是得到一个consol错误,说cardSwipe是未定义的。我不知道是什么原因造成的。

/* Initiate HammerJS on elements */
        initHammer : function()
        {   
            /* Create Hammer object for swipable game cards */
            Game.$gameCard = $('.game-card-mobile');
            Game.$gameCardTouch = Game.$gameCard.hammer();
            Game.$gameCardTouch.on("panleft panright press", cardSwipe(ev, $(this), data));     
        },
        cardSwipe : function(ev, element, data) {
            console.log(ev.type);
            console.log(element);
            console.log(data);
        }

编辑:添加Game.cardSwipe解决了这个问题,但现在我得到了一个错误:ev是未定义的,其中ev是一个hammer.js事件,应该被识别(如果我将函数交换为函数(ev){..})

这是因为cardSwipe在该上下文中确实是未定义的,它是父对象的一部分,并且使用this.cardSwipe 访问

initHammer : function() {   
    Game.$gameCard = $('.game-card-mobile');
    Game.$gameCardTouch = Game.$gameCard.hammer();
    Game.$gameCardTouch.on("panleft panright press", this.cardSwipe(ev, $(this), data));     
},
cardSwipe : function(ev, element, data) {
    console.log(ev.type);
    console.log(element);
    console.log(data);
}

它看起来也像是你立即调用它,而不是引用它,通常你会将它转换为类似的东西

Game.$gameCardTouch.on("events", this.cardSwipe);  

或者,如果您需要参数,请使用匿名函数

initHammer : function() {   
    var self = this;
    Game.$gameCardTouch.on("panleft panright press", function() {
        self.cardSwipe(ev, $(self), data);
    });
},
cardSwipe : function(ev, element, data) {
} 

但我不知道cardSwipe到底返回了什么,以及它应该如何工作?

在代码中,cardSwipe函数是某个对象的属性。您必须使用该对象引用,如:

obj.cardSwipe(...)

以便调用它-其中obj是包含该属性的对象。

我不知道你的代码的整个上下文,但似乎合适的参考可能是:

this.cardSwipe(...);

因为您是从同一对象的方法调用它的。


与其他一些语言不同,当前对象上的方法不会自动进入作用域。必须使用this引用当前对象才能访问当前对象上的属性或调用方法。


此外,看起来您正在尝试设置一个事件处理程序。在这种情况下,您不希望立即调用cardSwipe(),而是传递一个函数引用,并且您需要将this的值保存到本地,以便在回调中引用它:

initHammer : function() {   
    var self = this;
    Game.$gameCard = $('.game-card-mobile');
    Game.$gameCardTouch = Game.$gameCard.hammer();
    Game.$gameCardTouch.on("panleft panright press", function() {
        self.cardSwipe(ev, $(self), data));
    });
},