javascript - Soalan tentang apply() dan call()
滿天的星座
滿天的星座 2017-07-05 11:01:57
0
5
1173
function sum(num1,num2) {
    return num1 + num2;
}
function callSum1(num1,num2) {
    return sum.apply(this,arguments);
}
function callSum2(num1,num2) {
    return sum.apply(this,[num1,num2]);
}

alert(callSum1(10,10));
alert(callSum2(10,10));

//call()例子就省略了

Soalan:
1.sum.apply(this,arguments) merujuk kepada jumlah objek yang memanggil kaedah apply ini merujuk kepada callSum() dan sum() kedua-duanya berjalan dalam skop yang sama merujuk kepada "sum1, sum2 "?
2 Apakah nilai aplikasi apply() dan call() dalam projek?

滿天的星座
滿天的星座

membalas semua(5)
淡淡烟草味

Apa yang tertulis di atas memang rumit :)

Dengar saya, apa yang ditanya keliru
1:

function callSum1(num1,num2) {
    return sum.apply(this,arguments);    // 这里的arguments和下面的[num1,num2]是同一个意思
}
function callSum2(num1,num2) {
    return sum.apply(this,[num1,num2]);
}

argumen ialah objek seperti tatasusunan yang sepadan dengan hujah yang dihantar kepada fungsi. Objek argumen ialah pembolehubah tempatan yang tersedia dalam semua fungsi. Anda boleh menggunakan objek argumen untuk merujuk argumen fungsi dalam fungsi.

PS: Perkara ini tidak boleh ditentukan apabila fungsi ditakrifkan Hanya apabila fungsi itu dilaksanakan, ia boleh ditentukan kepada siapa ini sebenarnya, titik akhir ini adalah objek yang memanggilnya

2. Nilai aplikasi panggilan dan pakai (maksud kewujudan):

Fungsi wujud untuk menukar konteks masa jalan fungsi. Iaitu untuk menukar penunjuk ini di dalam badan fungsi

"Secara terang-terangan, a mempunyai kaedah xx, tetapi b tidak. B boleh meminta a untuk meminjamnya!" (Bukankah ini hanya warisan~)

Perbezaan antara call dan apply:

Cara menerima parameter adalah berbeza.

Seperti berikut:

panggilan menerima parameter berterusan, dan gunakan menerima parameter tatasusunan.
A.panggil(ini, a,b,c,d)
A.mohon(ini, [a,b,c,d])

Sebuah portal: http://www.jianshu.com/p/a7b1...

typecho
  1. argumen ialah salah satu atribut fungsi terbina dalam, yang mewakili objek tatasusunan fungsi, iaitu, argumen dalam callSum1 merujuk kepada num1 dan num2
    https://developer.mozilla.org...

  2. Nilai
  3. menggunakan dan memanggil ialah ia boleh membuat ini dalam fungsi yang ditentukan menghala ke objek tertentu Sebagai contoh, dom yang kita perolehi menggunakan document.querySelectorAll() sebenarnya adalah objek seperti tatasusunan, bukan tatasusunan kaedah tatasusunan , boleh jadi begini

var doms = document.querySelectorAll('p');
[].forEach.call(doms, function(e){
    //遍历元素
});

Perbezaan utama antara memohon dan panggilan ialah format parameter saya cadangkan anda menyemak MDN untuk soalan ini.

巴扎黑

1.sum.apply(this,arguments) merujuk kepada object sum yang memanggil kaedah apply Ini merujuk kepada callSum() dan sum() kedua-duanya berjalan dalam skop yang sama merujuk kepada "sum1, sum2"?

2 Apakah nilai aplikasi apply() dan call() dalam projek?

Untuk 1 keputusan pelaksanaan kedua-duanya kembali 20 20

sum.apply(this,arguments) merujuk kepada penggunaan apply to call sum Tentukan bahawa ini apabila jumlah dilaksanakan ialah argumen berikut ialah senarai parameter.

sum.apply(this,[num1, num2]) Sama seperti di atas.

Mengenai hujah, siarkan tangkapan skrin dan anda mungkin mempunyai pemahaman persepsi


Berikut adalah jawapan untuk point kedua

Dipetik sendiri

Lebih mudah difahami, ia adalah untuk menukar penunjuk ini, contohnya, semasa panggilan balik kejayaan permintaan ajax

Sebagai contoh, semasa membangunkan vue, jika tiada fungsi anak panah, anda perlu menggunakan var that = this untuk menyimpan ini buat sementara waktu. Jika anda boleh memilih ini, anda tidak akan menghadapi masalah ini

Beri saya buah berangan

function sayName(){
    console.log(this.name); 
}

var xiao_ming = {
    name: '小明妹妹'
}

// 钦点 this 
sayName.call(xiao_ming); 

Tukar objek seperti tatasusunan kepada tatasusunan sebenar

argumen menyimpan senarai parameter fungsi dalam bentuk objek seperti tatasusunan.

function sumAll(){
    var argu = Array.prototype.slice.call(arguments); 
    
    // 从 0 开始积、每次 sum + cur 作为下次的 sum 
    return argu.reduce((sum, cur) => sum + cur, 0); 
}

Malah, kita boleh lihat dari sini: melaksanakan slice hanya memerlukan objek untuk mempunyai length 正确的下标 untuk melaksanakan seperti biasa dan mengembalikan hasilnya.

Oleh kerana banyak kaedah tatasusunan boleh digunakan pada objek seperti tatasusunan, objek seperti tatasusunan sememangnya boleh dianggap tatasusunan dalam banyak kes.

// 声明一个类数组对象 
var a = {
    0: 'hello',
    1: 'seg',
    2: 'ment',
    3: 'fault',
    length: 4
}

// forEach 
Array.prototype.forEach.call(a, elem => console.log(elem)); 
// => 遍历打印

// reduce 
var helloSF = Array.prototype.reduce.call(a, (acc, cur) => acc + cur + ' ', ''); 
console.log(helloSF); 
// => 
// "hello seg ment fault "


Anda juga boleh menjadikannya lebih seperti tatasusunan

var a = {
    0: 'hello',
    1: 'seg',
    2: 'ment',
    3: 'fault',
    length: 4
}

a.__proto__ = Array.prototype; 
a.forEach(e => console.log(e)); 
Array.prototype.reduce.call(a, (acc, cur) => acc + cur + ' ', ''); 

Objek Sangat Seperti Array

Melaksanakan fungsi separa Fungsi Separa

Serupa dengan fungsi separa dalam matematik, seperti:

fungsi f(x, y) = x + y
如果令 y = k 那么可以得到偏函数 f(x, k) = x + k
( 或者这样可能更好理解: f(x, 4) = x + 4 )

Bind biasanya digunakan untuk melaksanakan fungsi separa. Walau bagaimanapun, memohon, memanggil dan mengikat perlu dibincangkan secara intensif.

function logger(type){
    return console.log.bind(console, type); 
}

Gunakan memohon untuk mencapai perkara di atas logger ialah:

function logger2(type){
    return function(){
        var argu = Array.prototype.slice.call(arguments);  
        argu.unshift(type); 
        console.log.apply(console, argu); 
    }
}

Fungsi pesanan lebih tinggi dan kari

Fungsi tertib tinggi biasanya merujuk kepada fungsi yang nilai pulangannya ialah fungsi atau parameternya adalah fungsi.

setTimeout ialah contoh yang baik Ia menerima parameter (biasanya fungsi) dan melaksanakannya selepas kelewatan tertentu.
Tetapi selepas memasukkannya, ini biasanya menunjuk ke tetingkap objek global Jika anda ingin menentukan ini, anda perlu menggunakan panggilan memohon dan mengikat

Pencatat2 di atas melakukan ini dan mengembalikan fungsi


Mengenai kari, mari lihat fungsi dahulu add

function add(x, y){
    return a + b; 
}

add(1, 2); 
// => 
// 3 

Jika parameter boleh dilalui satu persatu, hasilnya akan diperolehi apabila diteruskan ke yang kedua:

var add1 = add(1); 
add1(2); 
// => 3 

add(3)(4); 
// => 7

Pelaksanaan pertama mengembalikan fungsi Jika tambah dianggap sebagai fungsi dalam pengertian matematik, ia adalah f(x, y) = x + y 我们执行了一次 add(1) 得到 add1 其实就是令 x = 1, jadi kita mendapat fungsi separa

f(1, y) = 1 + y

Lakukan y untuk kali kedua dan anda akan mendapat nilai sebenar, dan hasilnya boleh dikira menggunakan formula.

Ini sebenarnya adalah proses penyingkiran langkah demi langkah.


Untuk apa?

Saya baru dalam pengaturcaraan berfungsi dan masih belum memahami intipatinya. Satu-satunya kegunaan kari ialah 惰性求值
Operasi tadi tidak akan berjalan sehingga semua parameter diberikan.


Saya berjaga sepanjang malam dan menyemak imbas SF yang saya fikirkan ialah ini. . . .

过去多啦不再A梦

Set thisskop secara manual.

迷茫

Anda akan tahu selepas mencari di Baidu.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan