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

Javascript:对相邻对象的函数调用?,javascript,functional-programming,closures,Javascript,Functional Programming,Closures,您必须原谅我,因为我确信这在其他地方得到了解决,但我不知道该如何称呼这段语法或这个示例所说明的概念。这个get()函数如何知道我传递给它的参数引用了相邻数组的索引?我没有给get()任何表示我所指对象的指示,除非将对象直接放在它旁边的括号中会产生这种效果。这是正确的吗?这里是否有一个更广泛的概念,我不知道涉及到邻近性和函数调用 function get(prop) { return function(obj) { return obj[prop] } } get(1)([1,2,

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

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

// output = 2

您刚刚遇到了早期JS程序员最容易混淆的概念之一。这叫做“结束”。MDN在这个主题上有自己的观点

不过,一般来说,您可以考虑
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"

如果将
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]}

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

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

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

所以,我想说清楚一点;'get(1)([1,2,3])将数组作为参数传递给get函数。我只是不知道为什么它的工作方式与get(1,[1,2,3])不同,get(1,[1,2,3])返回“函数匿名(obj)”。Get()只接受一个参数,所以我理解为什么传入两个参数不起作用,但在我看来,如果Get()接受两个参数,那么这个->Get(1,[1,2,3])匿名函数(obj)实际上数组根本不会传入Get函数。这里有两个独立的函数调用。get(1)([1,2,3])将1传递给get函数,该函数返回另一个函数,该函数在数组[1,2,3]中传递时立即调用