Javascript: 对相邻对象的函数调用?

Javascript: Function call on adjacent object?

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

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

// output = 2

您刚刚遇到了早期 JS 程序员最容易混淆的概念之一。它被称为 "closure"。 MDN 有关于此主题的 good article

但一般来说,您可以考虑 get 返回一个新方法,其中 prop 的值 "saved" 与 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"

如果像这样将 get(1)([1,2,3]) 分成两行可能更有意义:

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

注意:执行此行后

var get1Function = get(1);

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

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

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

fn([1,2,3]);
// => 3