i具有一个函数,该功能接受函数作为参数。我想操纵该函数在功能A中的参数,并将其返回为functionc。我发现我可以使用.apply()来执行此操作,但是函数的原始上下文丢失了,而是由功能A替换。
例如,
var factory = {
return {
fnB: function() {}
}
};
fnA(fn) {
return fnC(params) {
var customparams = [params, {something: else}]
return method.apply(null, customparams);
}
}
var load = fnA(factory.fnB);
load(params);
但是,当我执行加载(参数)时,我会丢失functionb的上下文。函数b定义为工厂的方法。我该怎么做?谢谢!
我将假设method
实际上是fn
,并且functionB
是分配给对象属性的函数,并且您的实际代码中不存在各种语法错误:
var obj = {
name: "foo",
functionB: function() {
console.log(this.name); // <== Using `this` to refer to `obj`
}
};
function functionA(fn) {
return function functionC(params) {
var customparams = [params, {something: "else"}];
return fn.apply(null, customparams);
};
}
var load = functionA(obj.functionB);
load("a", "b"); // Fails because `this` in the call to `functionB` isn't `obj`
如果是这样,您可以在几个wasy中修复它:
1)使用 Function#bind
whne将 functionB
传递到 functionA
:
var load = functionA(obj.functionB.bind(obj));
load("a", "b"); // Works
var obj = {
name: "foo",
functionB: function() {
snippet.log(this.name); // <== Using `this` to refer to `obj`
}
};
function functionA(fn) {
return function functionC(params) {
var customparams = [params, {
something: "else"
}];
return fn.apply(null, customparams);
};
}
var load = functionA(obj.functionB.bind(obj));
load("a", "b"); // Works
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
2)正如Bergi所建议的那样,通过向functionA
添加第二个参数,它在调用fn
时使用(请参见摘要中)&nbsp;&mdash;例如,许多ES5 Array
方法都使用了这种方法:
var obj = {
name: "foo",
functionB: function() {
snippet.log(this.name);
}
};
function functionA(fn, thisArg) { // <=== Accepting thisArg
return function functionC(params) {
var customparams = [params, {
something: "else"
}];
return fn.apply(thisArg, customparams); // <=== Using it
};
}
var load = functionA(obj.functionB, obj); // <=== Passing it
load("a", "b"); // Works
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>