Bagaimanakah fungsi tertib tinggi seperti .map() berfungsi dalam JavaScript?
P粉107772015
P粉107772015 2023-08-25 17:41:30
0
2
474
<p>Pada masa kini semua orang cuba menggunakan fungsi tertib tinggi ini untuk mendapatkan hasil yang menjanjikan dengan menulis kod yang lebih sedikit. Tetapi saya ingin tahu bagaimana fungsi ini berfungsi secara dalaman. </p> <p>Andaikan saya menulis sesuatu yang serupa</p> <p> <pre class="brush:js;toolbar:false;">var numbers = [16, 25, 36]; var keputusan = numbers.map(Math.sqrt); console.log(hasil); // [4, 5, 6]</pre> </p> <p>Saya tahu bahawa setiap elemen tatasusunan "nombor" diulang satu demi satu, tetapi <em>bagaimana</em>? </p> <p>Saya cuba mencarinya tetapi masih belum mendapat jawapan yang memuaskan. </p>
P粉107772015
P粉107772015

membalas semua(2)
P粉505450505

Saya rasa setiap pembekal harus mengikut Spesifikasi

Pelaksanaan sebenar (cth. V8) boleh menjadi agak rumit, lihat jawapan ini sebagai permulaan. Anda juga boleh merujuk kepada kod sumber v8 dalam github, tetapi mungkin tidak mudah untuk memahami sebahagian daripadanya secara berasingan.

Memetik jawapan di atas:

Spesifikasi ES2015:

  1. Biar O menjadi ToObject(nilai ini).
  2. ReturnIfAbrupt(O).
  3. Biar len menjadi ToLength(Dapatkan(O, "length")).
  4. ReturnIfAbrupt(len).
  5. Jika IsCallable(callbackfn) adalah false, pengecualian TypeError akan dilemparkan.
  6. Jika Arg ini disediakan, biarkan T menjadi Arg ini; sebaliknya biarkan T tidak ditentukan.
  7. Biar A menjadi ArraySpeciesCreate(O, len).
  8. ReturnIfAbrupt(A).
  9. Biar k menjadi 0.
  10. Ulang sementara k len
    1. Biar Pk menjadi ToString(k).
    2. Biar kPresent menjadi HasProperty(O, Pk).
    3. ReturnIfAbrupt(kPresent).
    4. Jika kPresent adalah benar, maka
      1. Biar kValue menjadi Get(O, Pk).
      2. ReturnIfAbrupt(kValue).
      3. Biar MappedValue menjadi Panggilan(callbackfn, T, «kValue, k >, atau ».
      4. ReturnIfAbrupt(mappedValue).
      5. Biar Nyatakan menjadi CreateDataPropertyOrThrow(A, Pk, mappedValue).
      6. ReturnIfAbrupt(status).
    5. Tingkatkan k sebanyak 1.
  11. Kembali ke A.
P粉333395496

.map Hanya kaedah yang menerima panggilan balik, memanggil panggilan balik untuk setiap item tatasusunan dan memberikan nilai kepada tatasusunan baharu. Ia tidak istimewa. Anda juga boleh melakukannya sendiri dengan mudah:

Array.prototype.myMap = function(callback) {
  const newArr = [];
  for (let i = 0; i < this.length; i++) {
    newArr.push(callback(this[i], i, this));
  }
  return newArr;
}

var numbers = [16, 25, 36];
var results = numbers.myMap(Math.sqrt);
console.log(results); // [4, 5, 6]
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan