【问题标题】:Access values of object from within a javascript closure从 javascript 闭包中访问对象的值
【发布时间】:2013-09-24 16:06:40
【问题描述】:

我不知道如何访问该值,这是我的代码:

function Filters()
{
    this.filters = ["filter_1", "filter_2", "filter_3"];
    this.someData = "test";
    this.draw = draw;
    function draw(){
        for(var i=0; i<this.filters.length;i++)
        {
            var filter = this.filters[i];
            $("#" + filter).click(function(){
                doSomething();
            });
        }
    }
    function doSomething(){
        alert(this.someData);
    }
}

我知道由于 doSomething() 是从闭包内调用的,this. 将引用一个正在处理的 JQuery 对象。那么如何才能在该函数/闭包中从我的对象中使用someData 呢?好像没看懂。
感谢您的帮助:)

【问题讨论】:

  • 没有。如果您执行.click(doSomething),它将是 jQuery 对象。目前它什么都不是(或全局对象)。
  • Daniel,Filters() 是一个构造函数,编写为用new Filters() 调用。如所写,如果在没有new 的情况下调用,构造函数的行为将非常不同。要了解这里的问题,并了解如何编写能够容忍缺少new 的构造函数,请尝试this, by John Resig。这是相当重量级的东西,但值得坚持。
  • 您可能还需要阅读 Douglas Crockford 的 Private Members in JavaScript
  • @Beetroot-Beetroot :是的,我知道它是一个构造函数,我打算编写一个类,并将参数传递给构造函数等。我已经删除了所有这些,只留下了我认为相关的内容。我将阅读您链接的文章,谢谢:)
  • Daniel,对不起,我不是故意向你讲授你已经知道的东西。在他们之间,这两篇文章将教你很多关于 javascript 的知识。我希望它们早在 15 年前我开始我的职业生涯的 JS 链时就可以使用。

标签: javascript object closures


【解决方案1】:

不,this 内的 doSomething 将是全局对象。您需要在单独的变量中保留对 this 的引用:

function Filters()
{
    var that = this; // reference to this
    this.filters = ["filter_1", "filter_2", "filter_3"];
    this.someData = "test";
    this.draw = draw;
    function draw(){
        for(var i=0; i<this.filters.length;i++)
        {
            var filter = this.filters[i];
            $("#" + filter).click(function(){
                doSomething();
            });
        }
    }
    function doSomething(){
        alert(that.someData);
    }
}

与您的问题无关:您还可以传递对 doSomething 的引用作为事件侦听器,而不是将其包装在另一个函数中:

$("#" + filter).click(doSomething);

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2020-06-26
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多