Rumah > hujung hadapan web > tutorial js > Contoh pengaturcaraan fungsi JavaScript kemahiran analisis_javascript

Contoh pengaturcaraan fungsi JavaScript kemahiran analisis_javascript

WBOY
Lepaskan: 2016-05-16 16:02:17
asal
1306 orang telah melayarinya

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
Salin selepas log masuk

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));
 };
}
Salin selepas log masuk

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))));
Salin selepas log masuk

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
Salin selepas log masuk

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);
Salin selepas log masuk

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]
Salin selepas log masuk

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.

Berikut ialah cara untuk menggabungkan fungsi di atas bersama-sama :)

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)
Salin selepas log masuk
Lihat fungsi karang di bawah:

//下面在源代码上做了等价替换,可以再次等价于:
//square(sum(-1*mean + x)),再次展开(我剥,我剥,我剥洋葱...):
//Math.pow(sum(-1*mean + x),2);
compose(square,sum(-1*mean + x))
Salin selepas log masuk
Mari lihat fungsi peta:

//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))
Salin selepas log masuk
Kemudian lihat fungsi pengurangan di luar peta:

//将前面新数组的每个元素值加起来。
reduce(map(...),sum)
Salin selepas log masuk
Kemudian lihat pada fungsi timbal balik:

//等价于求(data.length-1)的倒数
reciprocal(sum(data.length,-1))
Salin selepas log masuk
Lihat fungsi produk luar:

//等价于新数组元素的和除以(data.length-1)
product(reduce(...),reciprocal(...))
Salin selepas log masuk
Sqrt paling luar bermakna mencari punca kuasa dua hasil pembahagian di atas; anda boleh membandingkannya dengan kod pengaturcaraan tidak berfungsi sebelumnya, ia adalah sama :) menakutkan, tetapi sukar selepas analisis Ia akan mencapai sifar serta-merta. Jika anda, pembaca, mengatakan anda masih tidak memahaminya pada akhirnya, ini sepenuhnya soal keupayaan ekspresi bahasa kucing saya, dan anda dialu-alukan untuk bertanya soalan.

Penjelasan telah berakhir, perjuangan telah berakhir, dan anda telah selesai.

Saya harap artikel ini akan membantu reka bentuk pengaturcaraan JavaScript semua orang.

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan