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

Javascript - putting an object's member function in a standalone variable?

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

所以像这样:

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

所以 fn(x) 应该和 str.indexOf(x) 做同样的事情。但这不起作用。还有另一种方法可以解决这个问题吗?

请注意,这里的难点在于我希望 fn 在那个特定的 str 对象 上调用函数 。 所以fn就是变成某种闭包。

You Don't Know JS Series,JS这样确定this

  1. 函数是用new(新绑定)调用的吗?如果是这样,这就是 新建对象。

    var bar = new foo()

  2. 调用的函数是with call还是apply(显式绑定),偶 隐藏在绑定硬绑定中?如果是这样,这是明确的 指定对象。

    var bar = foo.call( obj2 )

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

    var bar = obj1.foo()

  4. 否则,默认this(默认绑定)。如果在严格模式下, 选择未定义的,否则选择全局对象。

    var bar = foo()

你的问题

当你在 str.indexOf('e') 上调用 indexOf 时,JS 引擎开始查找函数中的上下文。它会看到您在字符串对象上使用 . 符号调用了该函数,并将上下文引用给它。但 当您获得函数的引用并尝试像 fn 那样调用时,引擎开始搜索上下文( 上面提到的 )但没有找到任何东西。否则,当您在外部获得函数引用时,它会失去它的上下文。所以你需要明确给出上下文。

我在这里写,每当调用fn时,函数内的this将引用str变量。

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

如果您使用的是 ES6 变体 javascript,您可以使用 "arrow function" 来实现这一点。这是一个很好的简短语法。

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

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

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