Contoh dalam artikel ini menerangkan pengaturcaraan berfungsi javascript. Kongsikan dengan semua orang untuk rujukan anda. Analisis khusus adalah seperti berikut:
JS, seperti bahasa dinamik lain, boleh menulis fungsi tertib tinggi Apa yang dipanggil fungsi tertib tinggi ialah fungsi yang boleh mengendalikan fungsi. Kerana dalam js fungsi adalah objek lengkap dan tergolong dalam kelas pertama warganegara, yang menyediakan prasyarat untuk pengaturcaraan berfungsi.
Berikut ialah contoh kod daripada tutorial js Fungsinya adalah untuk mengira purata dan sisihan piawai elemen tatasusunan Mula-mula, mari kita senaraikan cara menulis pengaturcaraan tidak berfungsi:
var data = [1,1,3,5,5]; var total = 0; for(var i = 0;i < data.length;i++) total += data[i]; var mean = tatal/data.length; //平均数为3 //计算标准差 total = 0; for(var i = 0;i < data.length;i++){ var deviation = data[i] - mean; tatal += deviation * deviation; } var stddev = Math,.sqrt(total/(data.length-1));//标准差为2
Untuk menggunakan pengaturcaraan berfungsi, kami mentakrifkan beberapa fungsi pembantu:
//将类数组对象转换为真正的数组 function array(a,n){ return Array.prototype.slice.call(a,n||0); } //将函数实参传递至左侧 function partial_left(f){ var args = arguments; return function(){ var a = array(args,1); a = a.concat(array(arguments)); return f.apply(this,a); }; } //将函数的实参传递至右侧 function partial_right(f){ var args = arguments; return function(){ var a = array(arguments); a = a.concat(array(args,1)); return f.apply(this,a); }; } //该函数实参被用做模版, //实参列表中的undefined值会被实际实参值填充。 function partial(f){ var args = arguments; return function(){ var a = array(args,1); var i = 0,j = 0; for(;i<a.length;i++) if(a[i] === undefined) a[i] = arguments[j++]; a = a.concat(array(arguments,j)); return f.apply(this,a); }; } //返回一个函数类似于f(g()) function compose(f,g){ return function(){ return f.call(this,g.apply(this,arguments)); }; }
Di bawah kami memberikan kod js sepenuhnya menggunakan pengaturcaraan berfungsi:
var data = [1,1,3,5,5]; var sum = function(x,y){return x+y;}; var product = function(x,y){return x*y;}; var neg = partial(product,-1); var square = partial(Math.pow,undefined,2); var sqrt = partial(Math.pow,undefined,0.5); var reciprocal = partial(Math.pow,undefined,-1); //好吧,高潮来鸟 :) var mean = product(reduce(data,sum),reciprocal(data.length)); var stddev = sqrt(product(reduce(map(data,compose(square,partial(sum,neg(mean)))),sum),reciprocal(sum(data.length,-1))));
Kecuali untuk fungsi pengurangan dan peta, fungsi lain diberikan di atas. Fungsi pengurangan adalah serupa dengan fungsi suntikan dalam ruby:
ary = (1..10).to_a ary.inject(0) {|sum,i|sum + i} //结果为55
js ditulis seperti berikut:
var ary = [1,2,3,4,5,6,7,8,9,10] ary.reduce(function(sum,i){ return sum + i; },0);
0 ialah nilai awal jumlah Jika diabaikan, jumlah ialah nilai elemen pertama tatasusunan Ia boleh diabaikan di sini.
Fungsi peta juga sangat mudah. Ia serupa dengan operasi pada setiap elemen tatasusunan dan kemudian mengembalikan tatasusunan selepas operasi Ambil kod js adalah serupa dengan ini:
a = (1..3).to_a; #数组[1,2,3] a.map {|x| x*2} #返回新数组[2,4,6]
Mari kita analisa rentetan kod yang panjang itu:)
jumlah dan produk mentakrifkan fungsi untuk menambah dan mendarab unsur
neg juga merupakan fungsi yang setara dengan: produk(-1,x), yang bermaksud nilai x negatif;
Fungsi segi empat sama adalah bersamaan dengan: Math.pow(x,2), yang mengira nilai kuasa dua bagi x Ambil perhatian bahawa parameter kedua separa di sini tidak ditentukan, yang bermaksud bahawa parameter formal di sini akan digantikan dengan parameter sebenar pertama.Fungsi sqrt adalah serupa dengan kuasa dua, dan fungsinya bersamaan dengan: Math.pow(x,0.5), yang bersamaan dengan mengira punca kuasa dua bagi x.
Salingan fungsi terakhir tidak sukar Ia bersamaan dengan: Math.pow(x,-1), iaitu, mengira kuasa negatif x, yang bersamaan dengan mengira salingan x.
Mari kita lihat pengiraan purata dahulu Ia sangat mudah: mula-mula hitung jumlah elemen tatasusunan dan kemudian darabkannya dengan salingan panjang tatasusunan, iaitu jumlah tatasusunan/panjang tatasusunan.
Akhir sekali, melihat sisihan piawai yang kelihatan sukar, lebih baik kita melihat dari dalam ke luar:
Mula-mula lihat lapisan yang mengandungi neg:
//等价于函数sum(-1 * mean + x) partial(sum,neg(mean)
//下面在源代码上做了等价替换,可以再次等价于: //square(sum(-1*mean + x)),再次展开(我剥,我剥,我剥洋葱...): //Math.pow(sum(-1*mean + x),2); compose(square,sum(-1*mean + x))
//Ia sangat jelas! ? Iaitu, setiap elemen dalam data adalah purata dan kemudian naikkan hasilnya kepada kuasa 2.
map(data,Math.pow(sum(-1*mean + x),2))
//将前面新数组的每个元素值加起来。 reduce(map(...),sum)
//等价于求(data.length-1)的倒数 reciprocal(sum(data.length,-1))
//等价于新数组元素的和除以(data.length-1) product(reduce(...),reciprocal(...))
Penjelasan telah berakhir, perjuangan telah berakhir, dan anda telah selesai.
Saya harap artikel ini akan membantu reka bentuk pengaturcaraan JavaScript semua orang.