Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Собственный цикл forEach (https://javascript.ru/forum/misc/81622-sobstvennyjj-cikl-foreach.html)

denis_alekss 26.12.2020 18:55

Собственный цикл 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? Как увидеть в этом коде что он дает?

Alexandroppolus 26.12.2020 19:52

Цитата:

Сообщение от denis_alekss
Зачем нужен все-таки thisArg? Как увидеть в этом коде что он дает?

конкретно в этом коде - ничего не дает.
но если передать в each не стрелочную и не забинденую функцию, то внутри неё значение this будет ссылаться на то, что передано в thisArg. При этом в нестрогом режиме, если в thisArg указано примитивное значение, оно будет обернуто в объект

рони 26.12.2020 19:58

denis_alekss,
Цитата:

Сообщение от Alexandroppolus
конкретно в этом коде - ничего не дает.
но если передать в each не стрелочную и не забинденую функцию, то внутри неё значение this будет ссылаться на то, что передано в 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,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>

voraa 26.12.2020 21:19

Это неправильный аналог 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>

denis_alekss 26.12.2020 23:58

Цитата:

Сообщение от рони (Сообщение 532125)
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>


А если поменять 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 ?

рони 27.12.2020 00:36

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.