【问题标题】:Difference between using variable self vs this使用变量 self 与 this 之间的区别
【发布时间】:2013-12-11 05:39:56
【问题描述】:

我一直在努力使用 .bind() 方法和变量“self = this”来使用这些“this”。在得到两个不同的结果时,我错过了一个概念。案例如下:

// Defining a callback class to use after retrieving data
var Callback = (function(){
    // UPDATED!! Local vbles
    var template_to_use, html_element, self;

    function Callback(){
        self = this,
        template_to_use = null,
        html_element = null;
    }

    var p = Callback.prototype;
    p.set_template = function(template_funct){
        self.template_to_use = template_funct;
    };

    p.set_html_element = function(html_element){
        self.html_element = html_element;
    };

    p.use_callback     = function(data){                                                              
        $(self.html_element).append(self.template_to_use(data));
    };

    return Callback;
})();

这个函数的用法如下:

// Setup callback 1 to call after getting the data
var callback_1 = new Callback();
callback_1.set_template(use_templ_1);
callback_1.set_html_element("#list");

// Get list data
api_list.get_data(callback_1.use_callback);


// Setup callback 2 to call after getting more data
var callback_2 = new Callback();
callback_2.set_template(use_templ_2);
callback_2.set_html_element("#object");

// Get object data
api_object.get_data(callback_2.use_callback);

执行了两个 ajax 调用,一旦 get_data() 函数完成,它们将调用我传递给它们的回调函数。我遇到的问题是,在执行这些函数后,回调总是提到 html_element = "#object" 和相应的模板 "use_templ_2"。

如果我使用“this”和 .bind 函数而不是“self”vble,结果是预期的。

// Get object data
api_object.get_data(callback_2.use_callback.bind(callback_2));

我错过了什么?这可能是一个错误概念,因为即使我不是 js 新手,我也是对语言本身的新理解。

【问题讨论】:

  • 您没有将 self 变量定义为局部变量,因此两个函数都使用 same 全局变量。
  • 首先,不要使用 .bind() ,除非你必须使用非常旧的 jQuery 版本。 on() 现在是首选方法。
  • @Juhana:var 好像不见了,除了最后一个之外,所有的都有逗号。
  • @trysis:这是 JavaScript 原生的 bind() 函数,用于在函数中永久设置 this 的值,而不是弃用的用于添加事件的 jQuery bind() 函数。
  • @Juhana 我已经更新了代码以使其成为本地代码,但我仍在访问相同的代码。实际上,我后来创建了一个检索“self vble”的方法。对我来说奇怪的是,在检查对象访问其属性时,这些值是好的,但是在咨询“自我”时,它们都包含相同的信息。我应该如何初始化self vble以避免共享相同的内容?

标签: javascript jquery


【解决方案1】:

如果您询问selfthis 之间的区别,那么self 用作对原始this 的引用。这意味着即使this 的内容发生了变化,那么self 仍然包含以前的内容。

不知道这是否足够清楚。如果不看看What underlies this JavaScript idiom: var self = this?Difference between self and this in javascript and when to use either of them

同时尽量避免使用self 作为全局变量,因为它现在被浏览器用来做一些事情。抱歉,我不记得是为了什么 - 如果有人可以编辑此信息,那就太棒了。

【讨论】:

  • 您可以使用window.self(当前窗口)与例如window.top进行比较。它与使用名为self 的本地变量不冲突,因为它具有更高的优先级。
【解决方案2】:

小心,self 将始终引用最后一个实例化的对象:

var c1 = new Callback();
var c2 = new Callback(); // overrides previous self

那么下面这行实际上设置了c2.html_element

c1.set_html_element(html_element);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

也就是说,替换 this 在您的情况下完全没用。

【讨论】:

  • 我一直在阅读您传递给我的链接,如果我正在实现共享 vbles 的模块模式,那将是有意义的。我错过了一些概念,但我不知道是哪一个。如果有两个声明,创建两个对象,为什么它们不保留自己的值?实际上,“template_to_use”和“html_element”属性保留了它们自己的值,而不是“self”属性。
  • 只有一个声明包装了 self 变量,所有对象实际上共享一个公共范围:(function(){...})()
  • 这确实很难解释,希望大家可以分享一些更好的链接。
猜你喜欢
  • 2012-11-28
  • 2013-11-15
  • 2013-10-23
  • 2013-05-28
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多