我发现了这个疯狂的 javascript 代码。
有人可以详细说明这段代码正在经历的确切步骤吗?为什么?
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
我发现了这个疯狂的 javascript 代码。
有人可以详细说明这段代码正在经历的确切步骤吗?为什么?
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
a
,它function
b
作为参数给出(因为a
被定义为本地范围内的变量a
,它将取代在父范围中声明的函数。)。 a
b
给出。c
c
是自调用的,它true
作为参数返回。您可以将其视为执行此操作的链:
a(var a) // function b given as arg. When a returns b() will be invoked
b(var b) // function c given as arg. When b returns c() will be invoked
c(true)
a
when 在函数内部(局部范围)是一个变量,因为function foo(bar){}
与function(){var bar = arguments[0]}
.
该函数a
可以这样编写并执行相同的操作:
function a(foo){
return foo;
}
您可以通过执行以下操作进行验证:
console.log('start');
(function a(a){
console.log('a', typeof a);
return a;
})
(function b(b){
console.log('b', typeof b);
return b;
})
(function c(c){
console.log('c', typeof c);
return c;
})
(true);
console.log('end');
控制台输出(更新为在 FF 中显示以及使用 Chrome 查看函数定义输出):
> start
> a function
> b function
> c boolean
> end
要了解发生了什么,请简化它:
(function a(d){
return 5*d;
})
(2)
上面的代码在控制台中运行,将输出10
. 发生的事情是括号告诉代码立即运行(它称为自调用函数),将后面的任何内容作为参数。所以我正在创建function a
,并立即将其2
作为参数运行。
你拥有的代码基本上是一样的,但是有更多的级别,没有乘法。您所有的函数都只返回它们的参数,并且传递的是 boolean true
,因此代码将true
在最后输出。
这返回true
。
第一个function a
(坏名?)被定义,它接受一个参数并返回它。该函数已被立即调用,其参数为(function b(b){ return b; })(function c(c){ return c; })(true)
. a
在调用之前对其进行评估。
(function b(b){ return b; })(function c(c){ return c; })(true)
是一个类似的构造,b
定义了一个函数,该函数返回它接收到的参数,并再次使用类似的参数立即调用,并且对于第三个函数也是如此c
。
(function a(a){
alert(a);
return a;
})
(function b(b){
alert(b);
return b;
})
(function c(c){
alert(c);
return c;
})
(true);
它只是用 () 符号返回参数的下一部分。
我会试一试。
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
这些都是自调用函数。
但是最后一个:
(function c(c){
return c;
})
(true);
获取传入的值 true。因此,当它返回“c”时 - 你得到 true。
对于其他人,它只是随着匿名函数在函数返回的值中传递而向上移动。所以,一个视觉。
(function a(a){ <-- the return of b, gets passed in here
return a;
})(function b(b){return b;}) <-- the return of c, gets passed in here
(function c(c){return c;})(true); <--- true gets passed into c.
函数按自上而下的顺序执行。您可以使用另一个函数作为其参数来调用一个函数。这可以。它一直这样做,直到“true”作为参数传递,在这种情况下,调用链返回“true”。
(function a(a){ // Function a is called with function b as an argument.
console.log('a'); // The console.log statement is executed,
return a; // Then function a returns b
})
(function b(b){ // Function b is called with function c as an argument.
console.log('b') // The console.log statement is executed
return b; // And then function b returns c
})
(function c(c){ // Function c is called with "true" as an argument
console.log('c') // The console.log statement is executed
return c; // And then function c returns true.
})
(true);