Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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 想要了解console.log.call.call.call.call.call.apply(a=>;a[1,2])的代码流;_Javascript - Fatal编程技术网

Javascript 想要了解console.log.call.call.call.call.call.apply(a=>;a[1,2])的代码流;

Javascript 想要了解console.log.call.call.call.call.call.apply(a=>;a[1,2])的代码流;,javascript,Javascript,我知道流程和方法是如何工作的,但说到这个问题,理解流程对我来说有些棘手。有人能帮我理解这一点吗 console.log.call.call.call.call.call.apply(a=>a[1,2])它不做任何事情,apply将返回1和2作为单独的值,而调用不会对其做任何事情,因为它不是一个函数。即使您执行console.log.call.call(a=>a[1,2])您也不会得到任何结果,因为第一个调用只返回数组[1,2],而第二个调用不能使用该数组执行任何操作 console.log.c

我知道流程和方法是如何工作的,但说到这个问题,理解流程对我来说有些棘手。有人能帮我理解这一点吗


console.log.call.call.call.call.call.apply(a=>a[1,2])
它不做任何事情,apply将返回
1
2
作为单独的值,而
调用
不会对其做任何事情,因为它不是一个函数。即使您执行
console.log.call.call(a=>a[1,2])
您也不会得到任何结果,因为第一个调用只返回数组
[1,2]
,而第二个
调用
不能使用该数组执行任何操作

console.log.call.call./*等等*/call./*不返回任何值({1,2})=
undefined*/call./*返回链上的{1,2}//apply(a=>a[1,2]);
//您可以尝试此操作,但不会返回任何内容:
console.log.call([1,2]);

虽然奇怪的是,我期望这种代码会抛出一个错误,但它没有,只是没有记录或抛出一个错误。所以它实际上不会返回任何东西…

首先,请注意,在JavaScript中,函数是对象,可以有自己的属性(您可以像任何其他对象一样使用
符号访问这些属性)。存在于所有函数上的属性中有和,它们本身就是函数

其次,
.call
.apply
都提供了使用指定值调用函数的机制。要理解这一点,
通常指当您将函数作为对象的方法调用时,
左侧的任何内容,例如,当您调用
foo.bar(1,2,3)
时,在
bar
的上下文中,
将指
foo
。因此,也可以使用
bar.call(foo,1,2,3)
bar.apply(foo,[1,2,3])
来实现类似的效果;在这两种情况下,第一个参数都变成
this

因此,基本上,
console.log
和所有的
.call
,除了最后一个之外,实际上并不重要。代码的初始部分只是尝试对某些函数应用
.call
,也可以很容易地替换为
function.prototype.call.apply

向前跳过一点,
a=>a
函数(a){returna;}
的缩写。它创建一个匿名函数,该函数接受一个参数并将该参数作为结果返回。请注意,此函数实际上并不引用
,因此之前对
.call
.apply
的所有调用几乎都是不相关的

最后一个
[1,2]
只是一个文本,包含两个项,
1
2
,它们可以通过
展开为参数。apply

因此,将其分解:

console.log.call.call.call.call.call.apply(a => a, [1, 2]);
可简化为:

Function.prototype.call.apply(a => a, [1, 2]);
var fn = a => a;
fn.call(1, 2);
可简化为:

Function.prototype.call.apply(a => a, [1, 2]);
var fn = a => a;
fn.call(1, 2);
.call
将使用其第一个参数作为函数的
值,并将后续值作为参数传递,并且由于
fn
不使用
,我们可以进一步将其减少为:

var fn = a => a;
fn(2);
由于
fn
只是一个简单的标识函数,因此结果如下:

2;

为什么?你在哪里看到这个代码?工作面试?@alfasin不,这是一个有趣的难题。它不是用于堆栈溢出的。此代码的使用没有上下文。OP没有提供关于他/她对该代码的理解或不理解的任何信息,并且该代码在任何实际应用程序中都没有实际用途。堆栈溢出不是教程站点。我们在指南中声明,您应该在发布之前进行研究。很明显,这里没有这样做。@ScottMarcus没有按照指导原则提出这一问题并不意味着这不是一个好问题@如果它不符合堆栈溢出的指导原则,那么对于堆栈溢出来说,这不是一个好问题,因此会出现否决票。我可以问一个很好的量子物理问题,但如果我问电影院里的那个家伙,那就不合适了。@p.s.w.g我怀疑它不是每个部分都有自己的,这确实很清楚,但它们的结合……比我现在删除的答案要好得多。很好的解释。直到我读到你的答案,我才理解你的行为-谢谢!真棒,事实上我知道调用和应用方法是如何工作的,但是我被语句/代码模式误导了!!