Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在lambdas vs functions和Typescript中使用关键字this时会发生什么_Javascript_Lambda_Typescript_Angular - Fatal编程技术网

Javascript 在lambdas vs functions和Typescript中使用关键字this时会发生什么

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

我正在为Angular 2项目使用Typescript。我注意到,当我们在labmda表达式和函数中使用关键字
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函数