强制它指示forEach语句中的所需对象

时间:2014-09-08 11:04:30

标签: javascript

这里我有一个程序可以计算一个人不同的日常活动,例如他在一周内踢足球的次数等等。这里有一个切换语句,用于计算不同活动的值。我强迫这个对象表示{{1在dayEvents object函数内部。但在sort()内部表示全局对象。也有一个错误是说足球没有定义。为什么会这样?我怎么也弄不清楚我怎么能强制THIS指示相同的forEach method对象??

dayEvents

2 个答案:

答案 0 :(得分:1)

将第二个参数提供给forEach,称为thisArg;在回调迭代器的过程中,它会将其用作this

我认为你正在寻找与外部调用迭代器相同的内部调用this,所以:

  this.container[i].forEach(function(elements,index,array){
    /* ...contents omitted for brevity... */
  }, this);
// ^^^^^^

或者,您可以通过Function#bind使用绑定功能,但由于forEach专门为您提供thisArg,这可能就是您的选择。 (所有其他ES5数组添加也都有,仅供参考 - someeveryreduce,...)


另外,正如乔治在对该问题的评论中指出的那样,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>

希望这会有所帮助。让我知道它是否有效