Javascript 为什么不管你用什么论点,它的结果总是正确的?

Javascript 为什么不管你用什么论点,它的结果总是正确的?,javascript,Javascript,我正在阅读“JavaScript Allongé”,在关于函数的一节中遇到了这一点 function (value) { return (function (copy) { return copy === value })(value) }(value); 假设我通过5。。。一个字符串、一个函数、一个数组或任何东西作为该问题的参数!为什么评估结果会是真的?似乎没有任何内容传递给参数copy,这是什么?我能想到的唯一一件事是,当您将5传递给value时,它也会被丢弃在返回函数的参

我正在阅读“JavaScript Allongé”,在关于函数的一节中遇到了这一点

function (value) {
  return (function (copy) {
    return copy === value
  })(value)
}(value);
假设我通过5。。。一个字符串、一个函数、一个数组或任何东西作为该问题的参数!为什么评估结果会是真的?似乎没有任何内容传递给参数copy,这是什么?我能想到的唯一一件事是,当您将5传递给value时,它也会被丢弃在返回函数的参数中


谢谢

您正在将同一对象传递回比较中。因此,它的计算结果为
true
。然而,这里发生的一些事情使得这比参考文献更有趣

{...})(value)
(值)
使其成为一个self,因此它是内联计算的。这是Javascript的一个很好的特性,理解它是值得的。您可以这样使用它们,但它们非常适合创建该范围和扩展代码

(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
换言之:

  • 5被传递到第一个外部函数,该函数接受一个
    value
    参数(
    value
    现在是
    5
  • 内部函数用
    value
    调用,它接受
    copy
    参数(
    copy
    现在等于
    value
    ,等于
    5
  • 内部函数将
    复制
    进行比较,两者都已设置为
    5

  • 所有这些都是一种奇妙的方法,将两个局部变量设置为相同的值,然后比较它们。因此,只要一个值等于它本身,它就会返回true。

    有一些东西被传递到参数copy示例的第四行正在发送以用作copy的参数

    因此,如果copy是value的副本,那么copy===value将始终返回true

    示例中的语法是定义然后立即调用函数。这个版本在逻辑上是相同的,如果这样看,可能行为更有意义:

    var funcA = function(value) {
      var funcB = function(copy) {
        return copy === value;
      }
      return funcB(value);
    }
    
    result = funcA(5);
    
    您在第一次调用中传递了5(值)

    函数(值){
    /*移除所有东西,以便在第一步中集中精力*/
    }(5);
    
    然后返回一个“函数调用”,该函数接收“value”(当前值为5)作为“copy”中接收的参数(因此copy的值现在为5)

    //函数(值){注释行还不重要,所以您可以集中精力
    返回(函数(副本){
    //返回副本===值
    })(价值)
    //}(价值);
    
    • 此内部函数返回“value”(可访问,因为内部函数可以访问外部范围(第一个函数及其参数))和“copy”(之前收到的“value=5”)的比较
      • value=5=copy然后返回true
    //函数(值){行还不重要,所以您可以集中精力
    //返回(函数(副本){
    返回副本===值
    //})(价值)
    //}(价值);
    

    简单地说,你在比较相同的值。

    这和我们所说的别名差不多吗?+通过提及和引用“自动执行匿名函数”的一个很好的解释,等等,我想我看到了。。。值(5)也在内部/返回函数中传递,然后在“copy”变量中使用。外部函数将5传递给值的方式有很多方面:)@安东尼奥:对。有两个自执行函数,每个函数都传递一个参数。