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决定以这种方式
-
的
this
被调用,新(新的结合)的功能?如果是这样,这是新构建的对象。var bar = new foo()
-
调用的函数调用带或应用(显式绑定),甚至 隐藏绑定硬约束力里面?如果是这样,这是明确的 指定的对象。
var bar = foo.call(obj2)
-
是带一个上下文(隐式绑定)的功能,否则 称为拥有或含有对象?如果是这样,这是上下文 对象。
var bar = obj1.foo()
-
否则,默认情况下,这个(默认绑定)。如果在严格模式下, 选择未定义,否则选择全局对象。
var bar = foo()
你的问题
当你调用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
如果您正在使用ES6各种JavaScript中,你可以使用一个 “箭头函数” 来实现这一目标。这是一个很好的简短语法。
为了进一步参考, see the mozilla docs on arrow functions
此变量当然可以围绕通过。请注意,通过此解决方案,变量fn拥有对正在执行函数的字符串的直接引用,因此它解决了上下文问题。
不错!出于兼容性原因,我更喜欢上面的'bind()'方法,但这是一个很好的选择。谢谢! – RocketNuts