Собственный цикл 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, время: 07:34. |