这里我有一个程序可以计算一个人不同的日常活动,例如他在一周内踢足球的次数等等。这里有一个切换语句,用于计算不同活动的值。我强迫这个对象表示{{1在dayEvents object
函数内部。但在sort()
内部表示全局对象。也有一个错误是说足球没有定义。为什么会这样?我怎么也弄不清楚我怎么能强制THIS指示相同的forEach method
对象??
dayEvents
答案 0 :(得分:1)
将第二个参数提供给forEach
,称为thisArg
;在回调迭代器的过程中,它会将其用作this
。
我认为你正在寻找与外部调用迭代器相同的内部调用this
,所以:
this.container[i].forEach(function(elements,index,array){
/* ...contents omitted for brevity... */
}, this);
// ^^^^^^
或者,您可以通过Function#bind
使用绑定功能,但由于forEach
专门为您提供thisArg
,这可能就是您的选择。 (所有其他ES5数组添加也都有,仅供参考 - some
,every
,reduce
,...)
另外,正如乔治在对该问题的评论中指出的那样,case
标签的价值有点可疑:
case football:
如果你有一个名为football
的变量(这可能会让一些人感到惊讶!),那么JavaScript中的有效,但是看看我怀疑你可能想要的代码:
case "football":
......和其他人一样。
答案 1 :(得分:1)
要在forEach循环中获取所需的对象,您需要将该对象作为forEach函数中的第二个参数传递。 你在切换案例中的'case football:'行中得到了这个错误。因为football不是变量,所以你需要将它用作String。
请使用以下代码。
<html>
<body>
<script>
(function(){
var dayEvents={
football:0,
school:0,
video_games:0,
watch_tv:0,
coding:0,
container:[],
insert:function(evt){
this.container.push(evt);
},
get:function(){
sort.call(this);
}
}
function sort(){
for(i=0;i<this.container.length;i++){
this.container[i].forEach(function(elements,index,array){
console.log(this);
switch(elements){
case 'football':
(this.football)++;
break;
case 'school':
(this.school)++;
break;
case 'video_games':
(this.video_games)++;
break;
case 'watch_tv':
(this.watch_tv)++;
break;
case 'coding':
(this.coding)++;
break;
}
}, this); //instead of 'this', you can also pass 'dayEvents'
}
}
dayEvents.insert(['football','school','video_games','watch_tv','coding']);
dayEvents.insert(['football','school','coding']);
dayEvents.insert(['school','video_games','watch_tv','coding']);
dayEvents.insert(['football','video_games','coding']);
dayEvents.insert(['school','watch_tv','coding']);
dayEvents.insert(['football','school','video_games','watch_tv','coding']);
dayEvents.insert(['football','school','video_games','coding']);
dayEvents.get();
console.log(dayEvents.football);
})();
</script>
</body>
</html>
希望这会有所帮助。让我知道它是否有效