无论您使用什么参数,为什么总是评估为真?

时间:2014-02-11 00:10:56

标签: javascript

我正在阅读'JavaScriptAllongé'并在有关功能的部分中看到了这一点。

function (value) {
  return (function (copy) {
    return copy === value
  })(value)
}(value);

说我传递5 ...字符串,函数,数组或ANYTHING作为参数!为什么评价为真?似乎没有任何内容传递给 copy 这个参数什么都没有?我唯一能想到的是,当你将5传递给value时,它也被丢弃在return函数的参数中?

谢谢!

4 个答案:

答案 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

换句话说:

  1. 5传递给第一个外部函数,该函数接受value参数(value现在是5
  2. 使用value调用内部函数,该函数接受copy参数(copy现在等于value,等于5)< / LI>
  3. 内部函数将copyvalue进行比较,两者都已设置为5
  4. 所有这些,是一种将两个局部变量设置为相同值,然后进行比较的奇特方法。所以只要一个值等于它自己,就会返回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);
  • 此内部函数返回&#34;值&#34;的比较。 (这是可访问的,因为内部函数可以访问外部作用域(第一个函数及其参数))和&#34;复制&#34; (以前曾收到&#34;价值= 5&#34;)
    • value = 5 = copy然后返回true。
//function (value) { lines doesn't care yet so you can focus
  //return (function (copy) {
     return copy === value
  //})(value)
//}(value);

说清楚你是否正在比较相同的值。