javascript模式:在私有和公共函数中引用“this”

时间:2013-06-17 00:54:14

标签: design-patterns javascript

我在搜索其他问题时,他们的“这个”问题并不是很相似。也谷歌搜索,但不是真的了解。

this在哪里推荐?正如quirksmode所说

  

..这总是指我们正在执行的功能的“所有者”,   或者更确切地说,对于一个函数是一个方法的对象。

对于像我这样的新手,它仍然令人困惑。代码是:

var Yourlib = (function() {
    var elementSelected = [],
    totalElement = 0;

    function yourQSA(str) {
        elementSelected = document.querySelectorAll(str);
        totalElement = elementSelected.length;

        return this // this#1 , where is "THIS" referencing to??
    }

    return {
        byClass : function(str) {
            elementSelected = document.getElementsByClassName(str);
            totalElement = elementSelected.length;

            return this; // this#2, the "THIS" is referencing to "Yourlib" obj
        },
        qsa : yourQSA,
        setColor: function(clr) {
            var n = 0;
            for ( ; n < totalElement; n++ ) {
                elementSelected[n].style.color = clr;
            }

            return this;
        }
    }

}());

问题:这个引用的#1在哪里?或者写return Yourlib;而不是return this;更好吗? (我们想链接方法)

谢谢

*注意,目标是创建链接方法。像Yourlib.byClass('yourclass').setColor('#ff0000');

这样的东西

3 个答案:

答案 0 :(得分:1)

一旦将两个函数作为对象的方法调用,this#1this#2将是同一个对象

Yourlib.byClass('yourclass').setColor('#ff0000');
Yourlib.qsa('.yourclass').setColor('#ff0000');

请注意,如果您执行类似

的操作
var qsa = Yourlib.qsa;
qsa('.yourclass').setColor('#ff0000');

它不会起作用,因为你没有将函数作为对象的方法调用。

您还可以使用applybindcall等函数在函数中设置this(上下文)

var qsa = Yourlib.qsa;
qsa.call(Yourlib, '.yourclass').setColor('#ff0000');
qsa.apply(Yourlib, ['.yourclass']).setColor('#ff0000');
(qsa.bind(Yourlib))('.yourclass').setColor('#ff0000');

答案 1 :(得分:0)

this引用当前方法所附加的对象,因为每个对象都有两个东西:

  • 属性
  • 和方法

this keyword

答案 2 :(得分:0)

this#1引用了Yourlib类型的对象,即它是“实例”。

this#2引用了由return { .... }

返回的匿名对象

这个概念是这样的:http://jsfiddle.net/MqqHY/

您可能会改变这种情况,但基本上,我认为您的目标代码存在一些缺陷,因为

var Yourlib = (function() {
...
}());

意味着您是立即执行此操作而不是仅定义新类?