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

Posted

技术标签:

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

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

function get(prop) 
  return function(obj) 
    return obj[prop]
  

get(1)([1,2,3]);

// output = 2

【问题讨论】:

【参考方案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"

【讨论】:

以上是关于Javascript:对相邻对象的函数调用?的主要内容,如果未能解决你的问题,请参考以下文章

javascript设计模式学习之二——this

c++ 虚函数 如何调父类 而非子类

js函数和date内置对象

JavaScript this指向ES5组合继承(构造函数+原型对象)错误处理

JS:构造函数

在js中获取作成者