Javascript 将作用域绑定到forEach循环中的项

Javascript 将作用域绑定到forEach循环中的项,javascript,node.js,typescript,ecmascript-6,Javascript,Node.js,Typescript,Ecmascript 6,这对我来说很难在标题中解释,所以我只举一个例子来更好地解释: 我想将诸如()=>{console.log(this.operatorValue)}之类的函数作为参数传递给递归traverseCriteria函数 traverseCriteria函数 function traverseCriteria(arr, parameters,fn) { for (const item of arr) { if (Array.isArray(item))

这对我来说很难在标题中解释,所以我只举一个例子来更好地解释:

我想将诸如
()=>{console.log(this.operatorValue)}
之类的函数作为参数传递给递归
traverseCriteria
函数

traverseCriteria函数

  function traverseCriteria(arr, parameters,fn) {
        for (const item of arr) {
          if (Array.isArray(item))
          this.traverseCriteria(item, parameters)
          else if (typeof item === 'object'){
              item.operatorValue = parameters[item.Property]
             console.log(item.operatorValue)  ///<-- REPLACE THIS WITH fn()
            //fn()
          }
        }
        return arr
      }
函数调用:

  traverseCriteria(criteria,parameters,()=>{console.log(this.operatorValue)}); 
您可以使用或设置函数的
值:

fn.call(item)

但是,请记住,箭头函数没有自己的
值,因此要实现此功能,您必须传递一个“正常”函数。

您只需将
项.operatorValue
作为参数传递给您的函数即可

函数遍历目录(arr、参数、fn){
用于(arr的施工项目){
if(阵列isArray(项目))
this.traverseCriteria(项目、参数)
else if(项目类型==='object'){
item.operatorValue=参数[item.Property]
fn(项目1)
}
}
返回arr
}
然后叫它

traverseCriteria(标准、参数,(item)=>{console.log(item.opValue)});

在函数的整个生命周期中,箭头函数中的此值保持不变,并且始终与最近的非箭头父函数中的此值绑定

箭头函数不能在任何地方都使用,不是在这种情况下,传递正常函数将起作用


伟大的文章:.

对我来说,最有价值的方法是将标准项的实际处理与
traverseCriteria
方法分开,后者的唯一责任应该是通过

因此,
traverseCriteria
的足迹仍然很小,人们可以专注于实际的处理任务。后者的实现可以更容易地重构,例如OP的目标

由于不太清楚这些目标实际上是什么,该方法提供了两种解决方案,以解决可能需要的问题。首先,这个额外传递的处理程序可以理解为一个对条件项进行操作的方法。在这种情况下,只需将特定的条件项via应用于此处理程序。第二,这就是我的建议,我们应该把这个处理程序看作是特定于项的回调的最通用的形式。因此,一个类似快照的应用程序会将所有相关数据传递给它。然后,如何实现这样的回调处理程序就留给使用
traverseCriteria
方法的人了

函数processContextualItem(项、idx、arr){
const{target,params,itemHandler,genericCallback}=this;
if(阵列isArray(项目)){
traverseCriteria(item、params、itemHandler、genericCallback);
}else if(项&(项的类型=='object')){
item.operatorValue=参数[item.Property];
//我希望能够取代
//console.log(item.operatorValue)
//带fn();
//例如,带有绑定项目引用的*项目特定*。
调用(item/*,idx,arr;
//例如,对于任何类型的“回调”,都是*最通用的*。
genericCallback(项、idx、arr、参数、目标);
}
}
函数traverseCriteria(arr、params、itemHandler、genericCallback){
arr.forEach(processContextualItem{
目标:这个,,
params,
itemHandler,
泛型回调
});
返回arr;
}
常量testType={
福:“福”,
酒吧:“酒吧”,
横纹肌
};
函数itemMethod(){
console.log('\n this.operatorValue:',this.operatorValue);
}
函数genericCallback(项、idx、arr、参数、目标){
console.log('\n item.operatorValue:',item.operatorValue);
log('\n idx,arr,params,target:',idx,arr,params,target);
}
const params={电话:“23138213”,“国家”:“俄罗斯”};
常量标准=[
“福”{
“收藏”:“人”,
“财产”:“电话”,
“运算符”:“eq”,
“运算符值”:“23138213”
}, {
“收藏”:“个人资料”,
“财产”:“国家”,
“运算符”:“eq”,
“运营商价值”:“俄罗斯”
}, [
“酒吧”{
“收藏”:“人”,
“财产”:“电话”,
“运算符”:“eq”,
“运算符值”:“23138213”
},
“巴兹”
]
];
traverseCriteria(条件、参数、itemMethod、genericCallback)

.as console wrapper{min height:100%!important;top:0;}
是的,但问题是我可能并不总是想对
operatorValue
执行操作,我可能想在其他时间对
operatorValue
和其他一些属性执行操作。我不想在里面硬编码财产名称traverseCriteria@SamuraiJack:您只需将整个
项作为参数传递给回调函数。@SamuraiJack您似乎正在使用递归函数展平数组。您可能需要考虑只使用<代码>数组.Trime.Prime<代码>来删除递归,并使代码简单化,以回答我的问题。然而,出于好奇,如果我也想访问函数中的另一个参数,比如say。。数组本身。或者可能是在
for(arr的const item)之前声明的变量。
您可以将任意数量的参数传递给函数,例如
fn。调用(item,arr)
设置为
item
并将
arr
作为第一个参数传递给函数。但是,在这种情况下,最好不要考虑
这个
,而是使用一个更常见的“接口”,例如数组使用的接口(回调将当前项、项的索引和数组作为参数传递)。非常感谢,您的评论真的很有帮助。
fn.call(item)