Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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 如何使用;这";课堂上的;“回调”;在ES6中?_Javascript_Ecmascript 6_Babeljs - Fatal编程技术网

Javascript 如何使用;这";课堂上的;“回调”;在ES6中?

Javascript 如何使用;这";课堂上的;“回调”;在ES6中?,javascript,ecmascript-6,babeljs,Javascript,Ecmascript 6,Babeljs,我在ES2015中使用Babel。并且想要使用这个内部回调内部方法 class baz { bar = "xxx"; foo() { x(function() { console.log(this.bar); }); } } function x(callback) { return callback(); } var y = new baz(); y.foo(); 我要走了 TypeError:这是未定义的 因为据我所知,这是指x()中的回调函

我在ES2015中使用Babel。并且想要使用
这个
内部
回调
内部方法

class baz {
  bar = "xxx";
  foo() {
    x(function() {
      console.log(this.bar);
    });
  }
}

function x(callback) {
  return callback();
}
var y = new baz();
y.foo();
我要走了

TypeError:这是未定义的

因为据我所知,这是指
x()
中的回调函数。作为解决方案,我使用

class baz {
  bar = "xxx";
  foo() {
    var bar = this.bar;//<=====
    x(function() {
      console.log(bar);//<=====
    });
  }
}

function x(callback) {
  return callback();
}
var y = new baz();
y.foo();
baz类{
bar=“xxx”;
foo(){

var bar=this.bar;//查看箭头函数,尤其是与经典函数相比,箭头函数处理此
的方式

class baz {
  constructor() { this.bar = "xxx"; }
  foo() {
    x(() => {
      console.log(this.bar);
    });
  }
}
如果在调用
x
和调用回调之间更改了bar,则使用经典函数的解决方案将不起作用

这就是使用经典函数的方法

class baz {
  constructor() { this.bar = "xxx"; }
  foo() {
    const self = this;
    x(function () {
      console.log(self.bar);
    });
  }
}
或者你可以使用
bind
,我想

class baz {
  constructor() { this.bar = "xxx"; }
  foo() {
    x((function () {
      console.log(this.bar);
    }).bind(this));
  }
}

查看箭头函数,尤其是与经典函数相比,箭头函数处理此
的方式

class baz {
  constructor() { this.bar = "xxx"; }
  foo() {
    x(() => {
      console.log(this.bar);
    });
  }
}
如果在调用
x
和调用回调之间更改了bar,则使用经典函数的解决方案将不起作用

这就是使用经典函数的方法

class baz {
  constructor() { this.bar = "xxx"; }
  foo() {
    const self = this;
    x(function () {
      console.log(self.bar);
    });
  }
}
或者你可以使用
bind
,我想

class baz {
  constructor() { this.bar = "xxx"; }
  foo() {
    x((function () {
      console.log(this.bar);
    }).bind(this));
  }
}

哦,谢谢,你说得对。我忘了()=>{}没有原型。@Shekspir:它与原型没有任何关系。箭头函数没有
这个
绑定,所以它们从创建它们的上下文继承它。哦,谢谢,你说得对。我忘了()=>{}没有原型。@Shekspir:它与原型没有任何关系。箭头函数没有
这个
绑定,所以它们从创建它们的上下文继承它。这不是有效的ES2015。它在第二行(
bar=“xxx”
)无效。您需要A)将代码放入
构造函数(){/*…*/}
和B)使用
这个。
栏前面
。我认为没有必要输入
构造函数
。我认为最好输入构造函数变量,这些变量将在初始化时添加。这不是“思考”的问题这样或那样。该代码不是有效的ES2015代码。允许以这种方式定义实例字段有一个方法,但它只是阶段1(有阶段0到4,其中4“准备好包含在下一个规范中”)。它没有使ES2016规范中断,除非它进展更快,否则ES2017看起来不确定。因此,虽然巴贝尔可能会传输它(巴贝尔有许多非标准功能),但语法可能会在放入规范之前发生变化,留下非标准代码。这不是有效的ES2015。从第二行开始它是无效的(
bar=“xxx”
)。您需要A)将该代码放入
构造函数(){/*…*/}
中,B)使用
这个。
栏前面
。我认为放入
构造函数
是没有必要的。我认为最好是放入构造函数变量,这些变量将在初始化时添加。这不是“思考”的问题这样或那样。该代码不是有效的ES2015代码。允许以这种方式定义实例字段有一个方法,但它只是阶段1(有阶段0到4,其中4“准备好包含在下一个规范中”)。它没有使ES2016规范中断,除非它进展更快,否则ES2017看起来不确定。因此,虽然巴贝尔可能会传输它(巴贝尔有许多非标准功能),但语法可能会在放入规范之前发生变化,给您留下非标准代码。