我知道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
答案 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)太多了