【问题标题】:Javascript: Function call on adjacent object?Javascript:对相邻对象的函数调用?
【发布时间】:2015-11-16 12:04:41
【问题描述】:

您必须原谅我,因为我确信这已在其他地方得到解决,但我不知道如何称呼这种语法或此示例说明的概念。这个 get() 函数如何知道我传递给它的参数是指相邻数组的索引?我没有给 get() 任何关于我指的是什么对象的指示,除非将一个对象直接放在括号中,它会产生这种效果。它是否正确?这里是否有一个我不知道涉及邻近和函数调用的更广泛的概念?

function get(prop) {
  return function(obj) {
    return obj[prop]
  }
}
get(1)([1,2,3]);

// output = 2

【问题讨论】:

    标签: javascript functional-programming closures


    【解决方案1】:

    如果您将get(1)([1,2,3]) 拆分为 2 行,可能会更有意义:

    var get1Function = get(1);
    get1Function([1,2,3]) 
    // output = 2
    

    注意:执行此行后

    var get1Function = get(1);
    

    get1Function 现在设置为 function(obj) { return obj[1] }

    【讨论】:

    • 所以,要明确一点; 'get(1)([1,2,3])' 将数组作为参数传递给 get 函数。我只是不确定为什么这与返回“函数匿名(obj)”的get(1,[1,2,3])不同。 get() 只接受一个参数,所以我明白为什么传入两个参数不起作用,但在我看来,如果 get() 接受两个参数,那么 this -> get(1, [1,2,3] ) function anonymous(obj)
    • 实际上该数组根本没有传递给 get 函数。这里有两个单独的函数调用。 get(1)([1,2,3]) 将 1 传递给 get 函数,该函数返回另一个函数,该函数被立即调用,传入数组 [1,2,3]
    【解决方案2】:

    这里没有魔法。您有一个返回函数的函数。当您调用get(2) 时,返回的函数具有2 的值prop。您的代码基本上等同于:

    var fn = get(2);
    // fn = function(obj) {
    //        return obj[2]
    //      }
    
    fn([1,2,3]);
    // => 3
    

    【讨论】:

      【解决方案3】:

      您刚刚遇到了早期 JS 程序员最容易混淆的概念之一。这被称为“关闭”。 MDN 有一个关于这个主题的good article

      不过,一般而言,您可以想到 get 返回一个新方法,其中 prop 的值已“保存”为与首次调用 get 时相同的值。

      如果我们重命名一些内容并将其分解,您提供的代码示例可能会得到最好的理解:

      function createFunctionToReturnValueForProp(prop) {
        return function(obj) {
          return obj[prop]
        }
      }
      
      var getPropertyFor1 = createFunctionToReturnValueForProp(1);
      
      var array1 = [1,2,3];
      var array2 = [4,5,6];
      var obj = { "0": "foo", "1": "bar" };
      
      getPropertyFor1(array1); // 2
      getPropertyFor1(array2); // 5
      getPropertyFor1(obj); // "bar"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多