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

问题描述:

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

因此,像这样:

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决定以这种方式

  1. this被调用,新(新的结合)的功能?如果是这样,这是新构建的对象。

    var bar = new foo()

  2. 调用的函数调用带或应用(显式绑定),甚至 隐藏绑定硬约束力里面?如果是这样,这是明确的 指定的对象。

    var bar = foo.call(obj2)

  3. 是带一个上下文(隐式绑定)的功能,否则 称为拥有或含有对象?如果是这样,这是上下文 对象。

    var bar = obj1.foo()

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

    var bar = foo()

你的问题

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

在这里我写道,无论何时调用fn,函数内部的this都会引用str变量。

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

如果您正在使用ES6各种JavaScript中,你可以使用一个 “箭头函数” 来实现这一目标。这是一个很好的简短语法。

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

此变量当然可以围绕通过。请注意,通过此解决方案,变量fn拥有对正在执行函数的字符串的直接引用,因此它解决了上下文问题。

+0

不错!出于兼容性原因,我更喜欢上面的'bind()'方法,但这是一个很好的选择。谢谢! – RocketNuts