为什么是 angular.foreach context

Why angular.forEach context?

本文关键字:context foreach angular 为什么      更新时间:2023-09-26

我正在分析angular.forEach函数:

这是angular.forEach的代码:

var values = {name: 'misko', gender: 'male'};
var log = [];
angular.forEach(values, function(value, key) {
  this.push(key + ': ' + value);
}, log);
expect(log).toEqual(['name: misko', 'gender: male']);

上下文的描述是:

对象成为迭代器函数的上下文(this(。

我想出了一些问题:

为什么使用参数上下文以及何时有用?!

为什么使用它来代替日志变量

在您

提供的示例中,使用 this 或直接使用 log array 是一样的。这是因为callback forEach methodlog array中使用的scope定义相同。

但是,在某些情况下,该callback的定义可能与log array scope不同。然后,调用应如下所示:

angular.forEach(values, getNames, log);

在这种情况下,我们应该在回调中使用this,因为它将引用在不同scope中定义的log array

编辑:

请参阅此 JSFiddle 演示和以下代码,其中显示了我所解释的内容。

var getNames = function(value, key) {
  this.push(key + ': ' + value);
};
var processObject = function(){
  var log = []; 
  // Now getNames callback is defined in a different 
  // scope than log
  angular.forEach(values, getNames, log);
  return log;
}
var values = {name: 'misko', gender: 'male'};
var resultArray = processObject(values);
// This gives same result as your exmple
alert(resultArray); 

从未使用过angular.forEach((,但它看起来很简单。

  var hello = {
      message: 'Ok'
  };
  angular.forEach([' I', ' said', ' hello'], function (value) {
      this.message += value;
  }, hello);
  console.log(hello.message);

1/它将记录"好的,我说你好",所以基本上"上下文"参数将允许您更新您将引用的任何对象。用例非常广泛...

2/我认为这与执行上下文有关,也就是词法环境,这意味着this必须与 angular.forEach 的实现方式相关。只需检查angularjs源代码。