2016-04-22 2 views
0
someOperation.then(function(x) { 
    things.forEach(function(thing) { 
     //doing something with 'thing' that depends on variable 'x' 
    }); 
}); 

В коде выше, как я могу сделать переменную 'x' доступной внутри функции обратного вызова? Или мне нужно вернуться к использованию цикла for в этом случае?Передача аргументов функции Array.forEach

+1

У вас есть доступ к x в качестве замыкания –

+0

@ Gonzalo.- ok Я немного изменил свой код. Будет ли у меня доступ к x как к закрытию? потому что, когда я помещаю точку останова внутри функции обратного вызова forEach, я не вижу «x» в списке закрытий. – AyushISM

+2

, который должен быть указан в этом списке, вы должны использовать его как закрытие. Если нет, все переменные юниверса вашего js будут доступны. Просто используйте его внутри своей функции (т. Е. Распечатайте ее с помощью console.log), и вы увидите ее в списке –

ответ

0

Доступен.

let x = { 
 
    name: 'Mike' 
 
}; 
 
['Hello', 'Goodbye'].forEach(function(greeting) { 
 
    document.querySelector('pre').innerHTML += greeting + ', ' + x.name + '\n'; 
 
});
<pre></pre>

Что вы используете здесь известен как closure и является широко используемым средством JavaScript. В принципе, любая функция имеет доступ к любой другой переменной в своей родительской области.

function log(msg) { 
 
    document.querySelector('pre').innerHTML += msg + '\n'; 
 
} 
 

 
var global = 'global'; 
 
function firstLevel(third) { 
 
    var first = 'first'; 
 
    
 
    // `global` is in the parent scope so we can access it 
 
    log(global + ' -> ' + first); 
 
    
 
    function secondLevel() { 
 
    var second = 'second'; 
 
    
 
    // Same thing with `first` here 
 
    log(global + ' -> ' + first + ' -> ' + second); 
 
    
 
    // This even works with passed in arguments 
 
    log(global + ' -> ' + first + ' -> ' + second + ' -> ' + third); 
 
    
 
    // We can even change closed over variables 
 
    first = 'fourth?'; 
 
    } 
 
    
 
    secondLevel(); 
 
    log(first); // Notice that `first` changed. 
 
} 
 

 
log(global); 
 
firstLevel('third'); // Notice how `third` is used in `secondLevel`
<pre></pre>

+0

ok Я немного изменил свой код. Будет ли у меня доступ к x как к закрытию? – AyushISM

+1

@AyushISM Да, вы все еще делаете. Я добавил пример, в котором используется аргумент. Он работает одинаково. Вы можете доказать это сами, выполнив 'console.log (x)' в своем собственном коде. –

0

Вы можете пройти "thisArg" в качестве второго параметра Foreach так, например:

let x = { a: 123 }; 
things = ['foo', 'bar'] 
things.forEach(function(thing) { 
    alert(this.a + thing); 
}, x); 

Может быть полезно в зависимости от того, что вы пытаетесь сделать.

Смежные вопросы