1

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

在哪里this引用?正如 quirksmode 所说

..this 总是指我们正在执行的函数的“所有者”,或者更确切地说,指的是函数作为方法的对象。

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

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;
        }
    }

}());

问题:this#1 指的是哪里?还是写return Yourlib;而不是写更好return this;?(我们想链接方法)

谢谢你

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

4

3 回答 3

1

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

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

请注意,如果您执行类似的操作

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

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

您还可以使用apply,bind和之类的函数在函数call中设置this(上下文)

var qsa = Yourlib.qsa;
qsa.call(Yourlib, '.yourclass').setColor('#ff0000');
qsa.apply(Yourlib, ['.yourclass']).setColor('#ff0000');
(qsa.bind(Yourlib))('.yourclass').setColor('#ff0000');
于 2013-06-17T02:41:15.107 回答
0

this引用当前方法附加到的对象,因为每个对象都有两件事:

  • 特性
  • 和方法

这个关键字

于 2013-06-17T00:57:17.983 回答
0

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

this#2 引用了一个匿名对象,该对象由return { .... }

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

你可能会改变它,但基本上,我认为你的目标代码有一些缺陷,因为

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

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

于 2013-06-17T00:59:36.747 回答