使用变量self与此之间的区别

时间:2013-11-26 07:30:16

标签: javascript jquery

我一直在努力使用.bind()方法使用这些“this”并使用变量“self = 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()函数完成,它们将调用我传递给它们的回调函数。我得到的问题是,在执行这些函数之后,回调总是提到带有相应模板“use_templ_2”的html_element =“#object”。

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

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

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

2 个答案:

答案 0 :(得分:8)

如果您询问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作为全局变量,因为现在浏览器已将其用于某些事情。对不起,我不记得是什么 - 如果有人可以编辑这个信息那就太棒了。

答案 1 :(得分:3)

注意,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在你的情况下完全没用。