Собственный цикл forEach
Прочитал статью по ссылке как создать собственный цикл foreach. Вот код: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> const array1 = ['a', 'b', 'c']; const array2 = ['d', 'e', 'f']; const array3 = array1.concat(array2,5,7); //Собсвенный цикл forEach var each = function(arr, callback,thisArg) { var i, length = arr.length; for (i = 0; i < length; i = i + 1) { callback.call(thisArg,arr[i], i, arr); } }; each(array3,(rez,d,array3)=>{ result.innerHTML+= d + ' - ' + rez + '<br> ';} ) </script> </body> </html> Зачем нужен все-таки thisArg? Как увидеть в этом коде что он дает? |
Цитата:
но если передать в each не стрелочную и не забинденую функцию, то внутри неё значение this будет ссылаться на то, что передано в thisArg. При этом в нестрогом режиме, если в thisArg указано примитивное значение, оно будет обернуто в объект |
denis_alekss,
Цитата:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> const array1 = ['a', 'b', 'c']; const array2 = ['d', 'e', 'f']; const array3 = array1.concat(array2,5,7); //Собсвенный цикл forEach var each = function(arr, callback,thisArg) { var i, length = arr.length; for (i = 0; i < length; i = i + 1) { callback.call(thisArg,arr[i], i, arr); } }; each(array3,function(rez,d){ result.innerHTML+= d + ' - ' + this[d] + '<br> '} , array3) </script> </body> </html> |
Это неправильный аналог forErch.
Сравните результаты с настоящим <pre> <script> let ar = [1,2,,4,5,,6,,] //Собсвенный цикл forEach var each = function(arr, callback,thisArg) { var i, length = arr.length; for (i = 0; i < length; i = i + 1) { callback.call(thisArg,arr[i], i, arr); } }; document.write('each : <br>') each(ar, (x,i) => document.write(`${i} : ${x}<br>`)) document.write('<br>forEach : <br>') ar.forEach ((x,i) => document.write(`${i} : ${x}<br>`)) </script> </pre> |
Цитата:
А если поменять this[d] на array3[d] в строке: result.innerHTML+= d + ' - ' + array3[d] + '<br> '},array3) будет вывод такой же самый. Я так понял thisArg дает просто ссылку на массив и все? Но ведь к примеру такой код будет выводить все то же самое? Я изменил ниже. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> const array1 = ['a', 'b', 'c']; const array2 = ['d', 'e', 'f']; const array3 = array1.concat(array2,5,7); //Собсвенный цикл forEach var each = function(arr, callback) { var i, length = arr.length; for (i = 0; i < length; i = i + 1) { callback(arr[i], i, arr); } }; each(array3,(rez,d,array3)=>{ result.innerHTML+= d + ' - ' + rez + '<br> ';} ) </script> </body> </html> Зачем тогда всаживать thisArg ? |
denis_alekss,
зачем нужен thisArg, затем же, зачем нужен this в js! создаёт контекст в котором выполняется функция, можно использовать любой объект. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Тест</title> </head> <body> <p id="result"></p> <script> const array1 = ['a', 'b', 'c']; const array2 = ['d', 'e', 'f']; const array3 = array1.concat(array2,5,7); //Собсвенный цикл forEach var each = function(arr, callback,thisArg) { var i, length = arr.length; for (i = 0; i < length; i = i + 1) { callback.call(thisArg,arr[i], i, arr); } }; each(array3,function(rez,d){ result.innerHTML+= `${d}${this.str}${rez}<br>`} , {str : "---"}) </script> </body> </html> |
Часовой пояс GMT +3, время: 16:16. |