在 lambda 中使用关键字 this 与带有 Typescript 的函数时会发生什么
What is happening when using the keyword this in lambdas vs functions with Typescript
我正在为Angular 2项目使用Typescript。我注意到,当我们在 labmda 表达式与函数中使用关键字 this
时,this
指的是不同的东西。
例如,假设我有一个如下所示的 Angular 组件。
export class MyComponet {
isActive = true;
names = [ "john", "jeff", "jared" ];
doSomethingWithLambda() {
names.forEach( (value, index) => {
if(this.isActive) { //this.isActive refers to MyComponent.isActive
//do something...
}
});
}
doSomethingWithFunction() {
names.forEach( function(value, index) {
if(this.isActive) { //this.isActive is undefined, since this refers to the function
//do something
}
});
}
doSomethingWithFunction2() {
let isActive = this.isActive;
names.forEach( function(value, index) {
if(isActive) { //if we change isActive will this also change MyComponent.isActive?
//do something
}
});
}
}
这里到底发生了什么(可以这么说是在幕后)?lambda 内部this
背后的魔力是什么,使其能够"正确"引用外部类的字段?我知道函数内部this
将引用函数本身。
另外,我有一个doSomethingWithFunction2
方法,该方法将MyComponent.isActive
引用到局部变量中。如果我更改该局部变量,那应该就像更改它引用的变量一样,对吗?(无论是像整数/数字这样的"原语"还是像JSON { }这样的"对象")
fat-arrow函数语法是以下各项的简写:
function () { }.bind(this);
bind
是一个Javascript ES5方法,等效于这个:
Function.prototype.bind = function bind(context) {
var func = this;
return function () {
return func.apply(context, arguments);
};
}
关于
另外,我有一个doSomethingWithFunction2方法,它将MyComponent.isActive引用到局部变量中。如果我更改该局部变量,那应该就像更改它引用的变量一样,对吗?(无论是像整数/数字这样的"原语"还是像JSON { }这样的"对象")
在 Javascript 中,变量就像指针,除了一些有限的情况(原语和写入时复制对象)会在变化时更改引用的值。 重新分配不会更改原始值,例如 isActive = false;
但this.isActive = false
实际上会在this
上重新分配变量isActive
,现在希望正确分配。
这与 lambda 函数在 TS 中的实现方式有关。 这个 in 箭头函数是按词法推断的,因此它更符合下面的代码
函数 Person() { var self = this;有些人选择that
而不是self
。 选择一个并保持一致。 自我年龄 = 0;
setInterval(function growUp() { 回调引用其self
变量 该值是预期对象。 自我年龄++; }, 1000);}因此,在 lambda 函数中,它实际上不是这个,而是一个上下文更接近自我。这可能不是实际的实现,但更接近于让您了解正在发生的事情。
现在,当您在我无能为力的this
之外时,指的是全局变量,这将是window
lambda 函数类似于 javascripts bind 函数。
Protip 查看您的转译 JS 您的 lambda 函数是如何转换的。
- 从HTML调用typescript文件中的函数
- 理解typescript中的构造函数接口
- 应该如何在typescript中键入lodash流函数
- 我可以将函数导入到typescript类文件中吗
- 将typescript函数访问到angular中
- 在新路由器上使用订阅函数时出现Angular 2 typescript错误(rc 1)
- typescript定义构造函数或函数
- Typescript class.default 不是构造函数
- 我可以在 TypeScript 中扩展函数吗?
- 在 TypeScript 中的函数上使用静态修饰符有什么好处吗?
- 调用Typescript setter don't返回函数,尽管关联的getter可以工作
- 如何在运行时访问typescript类公共属性(调试)?只有构造函数和函数是可访问的
- Angular2/Typescript:从链接可观察函数访问实例变量
- 正在将构造函数函数迁移到TypeScript
- 有没有一种方法可以在泛型(<T>)函数/类(Typescript)中获取泛型类型的名称
- Typescript从类的构造函数调用方法
- TypeScript-如何定义具有任何类型参数的函数类型
- TypeScript 构造函数类型安全
- 如何从本机构造函数typescript扩展
- 如何在构造函数typescript中5秒后更新作用域值