为什么我在这段代码中失去了上下文
Why do I lose context in this code?
下面是我在使用展开运算符时丢失上下文的代码。
看函数"decorator"。当我失去上下文时,行被标记为"ERROR"
/** MethodDecorator example */
class Account {
public firstName: string;
public lastName: string;
public constructor(firstName: string, lastName: string) {
this.firstName = firstName;
this.lastName = lastName;
}
@decorator
public sayMessage(msg: string): string {
return `${this.firstName} ${this.lastName}: ${msg}`
}
}
function decorator(target: any, key: string, desc: any): any {
let originDesc = desc.value;
desc.value = function(...args: any[]): any {
return originDesc(...args); // ==> ERROR: context lost
//return originDesc.apply(this, arguments); // ==> all OK
};
return desc;
}
let persone = new Account('John', 'Smith');
let message = persone.sayMessage('Hello world!');
console.log(message); // ==> undefined undefined: Hello world!
据我所知,originDesc(...args);
等于originDesc.apply(this, arguments);
,所以为什么我的上下文丢失了?
据我所知,originDesc(…args);= originDesc。应用(这个参数);那么,为什么上下文丢失了呢?
不,没有。它相当于originDesc(args[0], args[1], /*etc.*/)
,它使用默认的this
(松散模式的全局对象,严格模式的undefined
)。
.apply
:
originDesc.apply(appropriateThisValueHere, args);
或.call
:
originDesc.call(appropriateThisValueHere, ...args);
根据代码中的注释:
//return originDesc.apply(this, arguments); // ==> all OK
appropriateThisValue
将是this
,因此:
originDesc.apply(this, args);
或
originDesc.call(this, ...args);
这是因为你设置了:
let originDesc = desc.value; // This is where you loose context
,然后调用originDesc
。这与这里描述的情况完全相同:如何在回调中访问正确的' This '上下文?
同样,originDesc(...args)
编译成originDesc.apply(void 0, args)
。(void
因为它没有上下文绑定,你可以在https://www.typescriptlang.org/play/上测试它)
相关文章:
- 将函数的上下文应用于javascript变量
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- 使用JQuery的动态上下文菜单
- 如何访问UIWebView'的子窗口上下文
- Javascript游戏输入失去焦点
- jquery日期选择器失去了交互性
- JQuery在单击正文时隐藏上下文菜单
- JQuery上下文菜单显示/隐藏问题
- 如何从HTTP上下文对象中获取Post数据
- HTML字符串作为上下文
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 丢失对象“;这个“;方法中的上下文
- 防止在移动Safari(iPad/iPhone)中长按/长按默认上下文菜单
- d3防止在上下文菜单上触发mouseout
- 是否可以在不更改上下文的情况下调用函数.apply
- 调用$.each()函数时上下文发生变化
- 何时可以;我的用户脚本在Javascript中触发右键单击(上下文菜单)
- 为什么我在这段代码中失去了上下文
- 我如何避免nodejs虚拟机脚本函数调用失去上下文时,调用的函数本身是在上下文中
- 失去上下文与parse.com javascript SDK