Javascript - 将对象的成员函数放在一个独立变量中?

时间:2017-10-05 12:01:55

标签: javascript function object closures member

我试图将一个特定对象的成员函数放在一个独立变量中,希望能够通过简单地使用新变量来调用该函数(在原始对象上)。

这样的事情:

xOfy(unit, value) {
  return unit / value;
}

yOfX(unit, value) {
  return unit * value;
}

xOfy(gbp, bitcoin)
// 0.00018

yOfx(bitcoin, gbp)
// 3225.26

因此var str = "abcdefgh"; var fn = str.indexOf; console.log(fn("e")); // supposed to output 4 应该与fn(x)相同。但这不起作用。还有其他方法可以解决这个问题吗?

请注意,这里的难点是我希望fn在特定的str.indexOf(x)对象上调用函数。 所以str将成为某种封闭。

2 个答案:

答案 0 :(得分:2)

You Don't Know JS Series开始,JS以这种方式确定this

  1. 是否使用new(新绑定)调用该函数?如果是这样,那就是 新建的物体。

    var bar = new foo()

  2. 使用call或apply(显式绑定)调用函数,甚至 隐藏在绑定硬绑定内?如果是这样,这是明确的 指定的对象。

    var bar = foo.call( obj2 )

  3. 是否使用上下文(隐式绑定)调用函数,否则 被称为拥有或包含对象?如果是这样,那就是上下文 对象

    var bar = obj1.foo()

  4. 否则,默认为此(默认绑定)。如果处于严格模式, 选择undefined,否则选择全局对象。

    var bar = foo()

  5. 您的问题

    当你在indexOf上调用str.indexOf('e')时,JS引擎开始在函数中查找上下文。它看到您在字符串对象上使用.表示法调用了函数,并将上下文引用到它。但 当您获得该函数的引用并尝试调用fn时,引擎开始搜索上下文(上面提到)并且没有找到任何内容。否则当你在外面获得一个函数引用时就会丢失它的上下文。所以你需要明确地给出上下文。

    我写道,只要调用fn,函数内的this就会引用str变量。

    var str = "abcdefgh";
    var fn = str.indexOf.bind(str);
    console.log(fn("e")); // supposed to output 4

答案 1 :(得分:1)

如果您使用的是ES6品种的javascript,则可以使用"箭头功能"为达到这个。这是一个很好的短语法。

var fn = () => str.indexOf("e");

供进一步参考, see the mozilla docs on arrow functions

这个变量当然可以传递。请注意,使用此解决方案,变量fn可以直接引用您正在执行函数的字符串,因此它可以解决您的上下文问题。