我正在阅读'JavaScriptAllongé'并在有关功能的部分中看到了这一点。
function (value) {
return (function (copy) {
return copy === value
})(value)
}(value);
说我传递5 ...字符串,函数,数组或ANYTHING作为参数!为什么评价为真?似乎没有任何内容传递给 copy 这个参数什么都没有?我唯一能想到的是,当你将5传递给value时,它也被丢弃在return函数的参数中?
谢谢!
答案 0 :(得分:6)
(function (value) { // function accepts a `value` as an argument
return (function (copy) { // function accepts a `copy` argument
return copy === value // `copy` and `value` are both 5
})(value) // `value` becomes `copy` on line 2
}(5)); // pass in 5, becomes `value` on line 1
换句话说:
value
参数(value
现在是5
)value
调用内部函数,该函数接受copy
参数(copy
现在等于value
,等于5
)< / LI>
copy
与value
进行比较,两者都已设置为5
。所有这些,是一种将两个局部变量设置为相同值,然后进行比较的奇特方法。所以只要一个值等于它自己,就会返回true。
答案 1 :(得分:2)
您正在将同一个对象传回比较中。因此,它评估为true
。但是,这里发生的一些事情使得这比参考
{...})(value)
(value)
使其成为自executing function,因此内联评估。这是Javascript的一个很好的功能,它需要了解。您可以通过这种方式使用它们,但它们非常适合创建范围和扩展代码的Javascript Modules。
答案 2 :(得分:2)
有一些内容传递给参数复制您的示例的第4行正在发送值以用作副本的参数强>
因此,如果副本是值的副本,则 copy === value 将始终返回true。
示例中的语法是定义然后立即调用函数。这个版本在逻辑上是相同的,当看到这种方式时,行为可能更有意义:
var funcA = function(value) {
var funcB = function(copy) {
return copy === value;
}
return funcB(value);
}
result = funcA(5);
答案 3 :(得分:1)
您在第一次通话中传递5(值)。
function (value) {
/*remove all stuff so you can focus in the firs step.*/
}(5);
然后你回复一个&#34;调用函数&#34;收到&#34;价值&#34; (当前值为5)作为&#34; copy&#34;中收到的参数。 (所以复制的价值现在是5)。
//function (value) { commented lines doesn't care yet so you can focus
return (function (copy) {
//return copy === value
})(value)
//}(value);
//function (value) { lines doesn't care yet so you can focus
//return (function (copy) {
return copy === value
//})(value)
//}(value);
说清楚你是否正在比较相同的值。