【问题标题】:javascript class accessibility variable scope issuejavascript类可访问性变量范围问题
【发布时间】:2015-07-20 05:25:21
【问题描述】:

我正在编写一个简短的类(第一次在 Javascript 中使用类)来处理我网站的菜单图标。此菜单图标需要能够在同一页面上多次实例化。

我在使用滚动事件触发函数时遇到了一个问题,该函数似乎不会影响到正确的类实例,这是我的伪代码:

var DynMenu = function(Name) {
 this.Name = Name;

 this.scrollHandler = function() {
     alert("Scroll: "+this.Name);
 };

 DynMenu.prototype.Pause = function() {
     alert("Pausing menu: "+this.Name);
     $(window).off("scroll", this.scrollHandler);
 };

 DynMenu.prototype.Start = function() {
     alert("Starting menu: "+this.Name);
     $(window).scroll(this.scrollHandler);
 };
}

此代码被调用并与以下内容一起使用:

var RevendMenu = new DynMenu("MenuIcon1");
RevendMenu.Start();
RevendMenu.Pause();

滚动页面时(在调用 RevendMenu.Start() 之后但在调用 RevendMenu.Pause() 之前),我收到消息“滚动:未定义”

你能告诉我为什么我没有得到 this.Name 的值以及如何解决这个问题吗?

非常感谢 问候 弗洛伦特

【问题讨论】:

    标签: javascript class object scope


    【解决方案1】:

    浏览器中的事件处理程序将this 设置为触发该事件的元素,或者在没有触发事件的元素的情况下设置为全局对象。在浏览器中,全局对象是window

    为了将 this 绑定到方法所属的对象,您可以使用.bind()

    $(window).off("scroll", this.scrollHandler.bind(this));
    

    或者,在没有.bind() 的旧浏览器中,您可以在闭包中捕获this

    var that = this;
    $(window).off("scroll", function() {that.scrollHandler()});
    

    有关this 工作原理的更详细说明,请参阅:How does the "this" keyword in Javascript act within an object literal?

    【讨论】:

    • 非常感谢 Slebetman 的帮助和非常有趣的链接
    • 我确认这对于检索我的对象变量非常有效,但关闭功能不再起作用,我至今不明白为什么,知道吗?
    • @ehretf:我不怎么使用 jQuery,所以你必须阅读 .off() 方法的文档。至于为什么this 之前不起作用的原因,请查看我在答案底部引用的链接。
    • 感谢您的回复,我已经检查了您的帖子,它很有启发性并且解释得很好。我尝试了一些更改,但在使用绑定时调用 DynMenu.Pause() 时没有找到移除滚动条的方法。把.off()换成window.removeEventListener("scroll", this.scrollHandler.bind(this), false);,把.on()换成window.addEventListener("scroll", this.scrollHandler.bind(this), false);是一样的
    • 啊。好的。我明白.off() 现在做了什么。要删除事件侦听器,您必须将相同的函数传递给它。我向您展示的所有解决方案都创建了一个新功能。因此传递给.off() 的函数与传递给.on() 的任何函数都不匹配。为了解决这个问题,通过执行var myHandler = this.scrollHandler.bind(this) 创建一个函数,然后将该变量传递给onoff,以便off 可以找到传递给on 的函数,以便将其从事件中删除跨度>
    猜你喜欢
    • 2021-11-13
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多