Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“什么是”呢;这";在javascript中对计算对象调用方法时?_Javascript_This - Fatal编程技术网

“什么是”呢;这";在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。因此,在语句中使用
&&
类似于从
类列表
对象中提取函数,然后调用孤立函数