我知道this可能是javascript中第二个被问到最多的东西,就在浮点运算之后.
我大致知道如何this工作的,以及它如何影响箭头功能.call(),.apply()和.bind().我以为我理解了它的一切.但我不.
在Web浏览器中,按预期document.createElement("div").classList.add("c")产生undefined.然而,这个表达令人惊讶地是一个错误.
(true && document.createElement("div").classList.add)("c")
Run Code Online (Sandbox Code Playgroud)
我预计它会是一样的,但它确实如此
Uncaught TypeError: Illegal invocation
at <anonymous>:1:54
Run Code Online (Sandbox Code Playgroud)
你的陈述
(true && document.createElement("div").classList.add)("c") 也可以改写如下:
var add = (true && document.createElement("div").classList.add)
add("c")
Run Code Online (Sandbox Code Playgroud)
[逻辑AND(&&)expr1 && expr2:如果可以转换为false,则返回 expr1; 否则,返回 expr2.]
您看到该函数add现在window是实际classList对象的一部分并失去对实际对象的引用,因此无法正确调用.
add this现在指向全局对象.
如果您执行以下操作(如果新div是您页面上唯一的div),则它再次引用原始对象:
(true && document.createElement("div").classList.add).bind(document.getElementsByTagName("div")[0].classList)("c")
Run Code Online (Sandbox Code Playgroud)