Javascript 在lambdas vs functions和Typescript中使用关键字this时会发生什么
我正在为Angular 2项目使用Typescript。我注意到,当我们在labmda表达式和函数中使用关键字Javascript 在lambdas vs functions和Typescript中使用关键字this时会发生什么,javascript,lambda,typescript,angular,Javascript,Lambda,Typescript,Angular,我正在为Angular 2项目使用Typescript。我注意到,当我们在labmda表达式和函数中使用关键字this时,this指的是不同的东西 例如,假设我有一个角度分量,如下所示 export class MyComponet { isActive = true; names = [ "john", "jeff", "jared" ]; doSomethingWithLambda() { names.forEach( (value, index) => { if(t
this
时,this
指的是不同的东西
例如,假设我有一个角度分量,如下所示
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中,这个
背后的魔力是什么,使得它能够“正确”引用外部类的字段?我理解函数中的此
将引用函数本身
另外,我还有一个
doSomethingWithFunction2
方法,它将MyComponent.isActive
引用到局部变量中。如果我改变那个局部变量,那应该和改变它引用的那个一样,对吗?(不管它是整数/数字之类的“原语”还是JSON{}之类的“对象”)胖箭头函数语法是以下内容的简写:
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
,该变量现在有望正确分配。胖箭头函数语法是以下的简写:
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
实际上会将变量isActive
重新分配给this
,该变量现在有望被正确分配。这与TS中的实现方式有关。这个in-arrow函数是根据词汇推断的,因此它更符合下面的代码
职能人员(){
var self=this;//有些人选择that
而不是self
。
//选择一个并保持一致。
self.age=0
setInterval(函数growtup(){
//回调指的是self
变量,其中
//该值是预期的对象。
self.age++;
}, 1000);
}
所以在lambda函数中,它实际上不是这个,而是一个更接近上下文的self。这可能不是实际的实现,但更接近于让您了解正在发生的事情
现在,当您在my Imponent之外时,此
指的是全局var,它将是窗口
lambda函数类似于javascripts
Protip查看您传输的JS如何转换lambda函数。这与如何在TS中实现有关。此in-arrow函数是根据词汇推断的,因此更符合下面的代码
职能人员(){
var self=this;//有些人选择that
而不是self
。
//选择一个并保持一致。
self.age=0
setInterval(函数growtup(){
//回调指的是self
变量,其中
//该值是预期的对象。
self.age++;
}, 1000);
}
所以在lambda函数中,它实际上不是这个,而是一个更接近上下文的self。这可能不是实际的实现,但更接近于让您了解正在发生的事情
现在,当您在my Imponent之外时,此
指的是全局var,它将是窗口
lambda函数类似于javascripts
Protip查看您传输的JS如何转换lambda函数