ES6类变量超出范围?

时间:2015-07-09 17:53:45

标签: javascript node.js ecmascript-6

刚刚切换到ES6,运行io.js。

我正在编写一些类代码,但是我遇到了意外错误。

'use strict';

var _ = require('lodash');

class Country {

  constructor(blocked) {
    this.blocked = ['USA'];
  }

  ok(input) {
    console.log('Receiving...',input['country']);
    console.log('Blocked:', this.blocked);
    if(_.includes('USA', input['country'])) {
      return -1;
    }
    return 0;
  }

}

module.exports = Country;

无论出于何种原因,{em>除了之外,this.blocked类变量的效果都很好。

当我登录时,它显示为Blocked: undefined

有关于这里发生了什么的任何想法?

加成

我正在调用另一个类中的函数,如下所示......

var Country  = require('./filters/country.js');
var country  = new Country();

class FilterClassifier {

    constructor() {
      var self = this;
      self.filters = [country.ok];
    }

    userFilter(params) {

      var self = this;

      var input = {
        country   : params.country,
      };

      console.log(self.filters[0](input));
    }

}

module.exports = FilterClassifier;

2 个答案:

答案 0 :(得分:4)

正如评论中所提到的,调用函数的方式删除了函数的上下文。

self.filters = [country.ok];

然后

console.log(self.filters[0](input));

表示this内的ok不会是country。你需要做

self.filters = [country.ok.bind(country)];

self.filters = [() => country.ok()];

我建议您在javascript中阅读this。在这种特殊情况下,简短的答案是this是根据函数的调用方式定义的。

var a = {};
a.fn = function(){};

var b = {};
b.fn = a.fn;

b.fn();

调用b.fn()时,函数内的thisb。这是因为当使用foo.bar()形式调用函数时,函数内的this被定义为调用函数的对象(foo)。在你的情况下,你有

self.filters[0]();

这意味着this函数中的ok实际上是self.filters,原因相同。

如果您有一个重要的特定this,那么您有责任确保在传递函数时,您传递的函数将设置正确的this。使用fn.bind(foo)将返回一个新功能,在调用时,使用给定的fn调用this

答案 1 :(得分:0)

看起来this.blocked的范围是constructor函数,this ok中的blocked没有名为this的标识符。

编辑 :我错了,感谢Pointy。为了帮助那些偶然发现这篇文章的人,我不会删除我的错误答案,而是分享我学到的东西。大卫,在评论中你要求找到解决方法。可以使用let variables替换this以避免混淆,或在调用函数时将bind()class Country { // variable scoped to class with let // set blocked = value in constructor // should not need 'this.' nor 'bind()' let blocked = []; ... } 一起使用。

this

" Determining this"说你有默认 country.ok.bind(country)绑定:undefined。您希望隐式绑定并获得显式绑定以使用=>

Further reading说明了胖箭var self = this;this如何使var InformationByTent = []; var numberOfOccupants; var Tent01Occupants = ["John", "Sam", "Harry"]; var Tent02Occupants = ["Dawn", "Amy", "Jane"]; var Tent03Occupants = ["Nate", "Peter"]; var arrayOfArrays = [Tent01Occupants, Tent02Occupants, Tent03Occupants]; var totalNumberTents = arrayOfArrays.length; var CampDuties = ["Build Fire", "Cook Dinner", "Sentry", "Hike Preparation"] var FridayDuty; var SaturdayDuty; var SundayDuty; for (i = 0; i < totalNumberTents; i++) { // Assume there are lines of code here that randomizes the duties and assigns three // of those to the FridayDuty, SaturdayDuty, SundayDuty variables. Results: // FridayDuty = "Build Fire"; // SaturdayDuty = "Hike Preparation"; // SundayDuty = "Cook Dinner"; numberOfOccupants = Tent01Occupants.length; InformationByTent.push({ tentNum: i + 1, Friday: FridayDuty, Saturday: SaturdayDuty, Sunday: SundayDuty, }); } 混淆。