2016-05-30 3 views
0

Я пытаюсь заменить анонимный вызов функции в javascript для реальной функции в forEach.Функция вызова в forEach с дополнительными параметрами

Что у меня есть что-то вроде:

whatever: function(importantParam) { 
    array.forEach(function (val) { 
     if (val === importantParam) console.log("OK"); 
    }); 
} 

То, что я хочу достичь, это что-то вроде:

whatever: function(importantParam) { 
    array.forEach(this.whatever2,this); 
}, 
whatever2: function(p1, importantParam) { 
     if (p1 === importantParam) console.log("OK"); 
} 

Таким образом, проблема в том, что я не знаю, как передать importantParam когда я вызываю any2 внутри forEach, так как он принимает функцию как аргумент с 2 аргументами для индекса и значения, и ничего больше.

ответ

1

Вам нужно обернуть whatever2 каким-то образом, например, используя .bind

var array = [1, 2, 3], 
    obj; 
obj = { 
    whatever: function (importantParam) { 
     array.forEach(this.whatever2.bind(this, importantParam)); 
    }, 
    whatever2: function (importantParam, p1) { 
     if (p1 === importantParam) 
      console.log("OK"); 
    } 
}; 

obj.whatever(2); // logs OK 

В ES6 вы можете очистить это и использовать функции стрелок

let obj = { 
    whatever(importantParam) { 
     array.forEach(x => this.whatever2(x, importantParam)); 
    }, 
    whatever2(p1, importantParam) { 
     if (p1 === importantParam) 
      console.log("OK"); 
    } 
}; 

Пожалуйста, обратите внимание, что этот пример случай использования вы указали внешний вид, как вы должны фактически использовать .some вместо .forEach и return true, где вы делаете журнал

+0

Спасибо большое! Работала отлично. Я просто привел пример того, как мне нужно передать этот дополнительный параметр, я не совсем сравниваю значения, нуждаюсь в этом для всего массива, но спасибо за этот дополнительный совет :) – Mayday

0

Заверните его с другой функцией

whatever: function(importantParam) { 
    array.forEach(function(item) { 
    this.whatever2(item, importantParam); 
    },this); 
}, 

или изменить порядок аргументов и использовать bind частично применить функцию обратного вызова

whatever: function(importantParam) { 
    array.forEach(this.whatever2.bind(this, importantParam)); 
}, 
whatever2: function(importantParam, p1) { 
     if (p1 === importantParam) console.log("OK"); 
} 
Смежные вопросы