在计算对象上调用方法时,javascript中的“this”是什么?

时间:2017-03-31 06:32:56

标签: javascript this

我知道this可能是javascript中第二个被问到最多的东西,就在浮点运算之后。

我通常知道this如何运作,以及箭头函数.call().apply().bind()如何影响它。我以为我理解了它的一切。但我没有。

在网络浏览器中,document.createElement("div").classList.add("c")按预期产生undefined。然而,这个表达令人惊讶地是一个错误。

(true && document.createElement("div").classList.add)("c")

我预计它会一样,但它是

Uncaught TypeError: Illegal invocation
    at <anonymous>:1:54

3 个答案:

答案 0 :(得分:5)

您的陈述

(true && document.createElement("div").classList.add)("c")也可以改写如下:

var add = (true && document.createElement("div").classList.add)
add("c")

[逻辑AND(&amp;&amp;)expr1&amp;&amp; expr2:返回 expr1,如果它可以转换为false;否则,返回 expr2。]

您看到函数add现在是window的一部分,并且丢失了对实际classList对象的引用,因此无法正确调用。

添加this现在指向全局对象。

如果您执行以下操作(如果新div是您页面上唯一的div),则它再次引用原始对象:

(true && document.createElement("div").classList.add).bind(document.getElementsByTagName("div")[0].classList)("c")

答案 1 :(得分:3)

这将有效,因为它将this作为classlist上下文

返回
(document.createElement("div").classList.add)("c")

(true && document.createElement("div").classList.add)无效,因为add正在评估&amp;&amp;表达式之后,它返回表达式(true && document.createElement("div").classList.add)的上下文,它是add() { [native code] }而不是classList,在这里我们尝试调用add on add function。

当您尝试将班级名称("c")传递给add时,这不再是classlist因此Illegal invocation

答案 2 :(得分:-7)

你要做的事情没有意义。 也许你的意思是

var added document.createElement("div").classList.add("c")
If (added){...….}

在您的示例中,添加

后a)太多了