“什么是”呢;这";在javascript中对计算对象调用方法时?
我知道,“什么是”呢;这";在javascript中对计算对象调用方法时?,javascript,this,Javascript,This,我知道,这个可能是javascript中第二个被问到最多的问题,仅次于浮点运算 我一般都知道这个是如何工作的,以及它是如何受到箭头函数、.call()、.apply()和.bind()的影响的。我以为我了解它的一切。但我没有 在web浏览器中,document.createElement(“div”).classList.add(“c”)按预期生成undefined。然而,这个表达令人惊讶地是一个错误 (true && document.createElement("div").
这个
可能是javascript中第二个被问到最多的问题,仅次于浮点运算
我一般都知道这个
是如何工作的,以及它是如何受到箭头函数、.call()
、.apply()
和.bind()
的影响的。我以为我了解它的一切。但我没有
在web浏览器中,document.createElement(“div”).classList.add(“c”)
按预期生成undefined
。然而,这个表达令人惊讶地是一个错误
(true && document.createElement("div").classList.add)("c")
我原以为会是一样的,但事实并非如此
Uncaught TypeError: Illegal invocation
at <anonymous>:1:54
未捕获类型错误:非法调用
时间:1:54
您的声明
(true&&document.createElement(“div”).classList.add)(“c”)
也可以重写如下:
var add = (true && document.createElement("div").classList.add)
add("c")
[逻辑AND(&&)expr1&&expr2:返回expr1(如果可以转换为false);否则,返回expr2。]
您可以看到,函数add
现在是窗口的一部分,并且失去了对实际classList
对象的引用,因此无法正确调用
add的这个现在指向全局对象
如果执行以下操作(如果新div是页面上唯一的div),则它再次引用原始对象:
(true && document.createElement("div").classList.add).bind(document.getElementsByTagName("div")[0].classList)("c")
你想做的事没有意义。
也许你是说
var added document.createElement("div").classList.add("c")
If (added){...….}
在您的示例中,a)add之后的内容太多,这将起作用,因为它将这个作为类列表
上下文返回
(document.createElement("div").classList.add)("c")
(true&&document.createElement(“div”).classList.add)
将不起作用,因为add
使用&&expression进行求值,然后返回表达式的上下文(true&&document.createElement(“div”).classList.add)
,即add(){[native code]}
而不是类列表,这里我们尝试调用add-on-add函数
当您试图将类名(“c”)
传递给添加时,这不再是类列表
,因此非法调用表达式和调用的目的是什么(true&&document.createElement(“div”).classlist.add)(“c”)
?在我的理解中,它与()
有关。当您在()
中编写任何内容时,它将成为一个表达式,并且它们有自己的上下文。因此,当您尝试计算.add
时,元素的上下文已被破坏,因此error@guest271314它使函数调用变得间接。请参见@guest271314:表达式的目的是说明问题。@guest271314:这是表示问题的最小代码。我根据真实的应用程序代码改编了它,但这不是真实的应用程序代码。这段代码的存在只是为了说明这个问题。你怎么知道它可以以同样的方式重新编写?这对我来说并不明显。这不是完全等效的,并且被重写以解释您的查询,逻辑and(&&&)expr1&&expr2:如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,如果两个操作数都为true,&&将返回true;否则,返回false。因此,在语句中使用&&
类似于从类列表
对象中提取函数,然后调用孤立函数