刚刚切换到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;
答案 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()
时,函数内的this
为b
。这是因为当使用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,
});
}
混淆。