Javascript js中的属性

Javascript js中的属性,javascript,node.js,Javascript,Node.js,为什么属性在{}之后未定义?如何修复它 function GitMetrics() { var arr = ["qwer", "asdf"]; arr.forEach(function(item) { this[item] = 1; var e = this.qwer; //1 }); var t = this.qwer; //undefined } exports.GitMetrics = GitMetrics; 有两种选择: 1使用fat箭头(需要ES6)

为什么属性在{}之后未定义?如何修复它

function GitMetrics() {
  var arr = ["qwer", "asdf"];
  arr.forEach(function(item) {
    this[item] = 1;
    var e = this.qwer; //1
  });
  var t = this.qwer; //undefined
}
exports.GitMetrics = GitMetrics;
有两种选择:

1使用fat箭头(需要ES6)

2将此作为参数传递

arr.forEach(function(item) {
  this[item] = 1;
  var e = this.qwer; //1
}, this);

我在变量tmp中保存对该变量的引用

function GitMetrics() {
   var arr = ["qwer", "asdf"];
   var tmp = this;
   arr.forEach(function(item) {
      tmp[item] = 1;
      var e = tmp.qwer; //1
   });
   var t = this.qwer; //1 it works
   }
exports.GitMetrics = GitMetrics;

因为
this
每次都指向不同的对象。例如,使用胖箭头语法进行回调。完全理解-以至于不必再考虑它,“this”的上下文是Javascript最伤脑筋的地方之一。我建议你读清楚一点@Sirko有一个简单的解决方法——不要声明“real”函数,而是使用=>()语法将“this”的上下文保持在您想要的范围内,而不是函数范围内,这正是您现在要做的。纯代码答案是不可接受的——请提供解释。另外,请正确格式化代码。
function GitMetrics() {
   var arr = ["qwer", "asdf"];
   var tmp = this;
   arr.forEach(function(item) {
      tmp[item] = 1;
      var e = tmp.qwer; //1
   });
   var t = this.qwer; //1 it works
   }
exports.GitMetrics = GitMetrics;