【发布时间】:2018-05-29 14:05:47
【问题描述】:
我正在阅读有关箭头函数的内容,并发现它们无法更改其上下文。
我正在创建一个接收函数然后更改其上下文的模块。但由于用户可能正在输入箭头功能,我无法实现它。
所以我想知道,由于无法更改箭头函数上下文,我是否可以复制其内容并创建一个新函数,该函数执行相同的操作,但现在具有受控上下文。
有什么想法可以实现吗?
一个例子是这样的:
class Foo {
constructor(name) {
this.name = name;
}
sayMyName() {
console.log(this.name);
return this.name;
}
}
class Scope {
constructor(reqId) {
this.foo = new Foo('Hi!');
this.reqId = reqId;
}
do(callback) {
const func = callback.bind(this, this);
func();
}
}
class Controller {
constructor() {
this.foo = new Foo('Hello!');
}
unscoped(req, res, next) {
var a = 1;
res.json({
success: this.foo.sayMyName()
});
}
scoped(req, res, next) {
req.scope.do((ctx) => {
var a = 1;
res.json({
success: this.foo.sayMyName()
});
});
}
}
我希望this.foo.sayMyName() 在Controller.scoped 中返回“hi”,在Controller.unscoped 中返回“hello”
【问题讨论】:
-
您可以使用
yourFunction.bind(context)(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…) 或 With.call(context)(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…) 或.apply(context)(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…) 更改函数的上下文 -
你能举个例子说明你想要达到的目标吗
-
"接收函数然后更改其上下文的模块。" - 已经有the native
bindmethod 了?!但是不,当使用箭头函数时,这意味着您不想要更改上下文,并且您不应该尝试这样做。这就像用户传递了一个根本不使用this关键字的函数——他们不需要动态上下文。 -
如果有人选择给你一个箭头函数或一个已经绑定的函数,他们基本上是在选择跳过你添加的任何逻辑。解决这个问题将破坏语言的语义。不要那样做。
标签: javascript ecmascript-6 arrow-functions