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
函数是用new(新绑定)调用的吗?如果是这样,这就是
新建对象。
var bar = new foo()
调用的函数是with call还是apply(显式绑定),偶
隐藏在绑定硬绑定中?如果是这样,这是明确的
指定对象。
var bar = foo.call( obj2 )
调用的函数是否带上下文(隐式绑定),否则
称为拥有或包含对象?如果是这样,这就是那个上下文
对象。
var bar = obj1.foo()
否则,默认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 直接引用您正在执行函数的字符串,因此它解决了您的上下文问题。
我正在尝试将来自特定对象的成员函数放入独立变量中,希望能够通过简单地使用新变量调用该函数(在原始对象上)。
所以像这样:
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
函数是用new(新绑定)调用的吗?如果是这样,这就是 新建对象。
var bar = new foo()
调用的函数是with call还是apply(显式绑定),偶 隐藏在绑定硬绑定中?如果是这样,这是明确的 指定对象。
var bar = foo.call( obj2 )
调用的函数是否带上下文(隐式绑定),否则 称为拥有或包含对象?如果是这样,这就是那个上下文 对象。
var bar = obj1.foo()
否则,默认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 直接引用您正在执行函数的字符串,因此它解决了您的上下文问题。