Fungsi ialah objek paling fleksibel dalam JavaScript Di sini kami hanya menerangkan penggunaan fungsi tanpa namanya. Fungsi tanpa nama: Ia adalah fungsi tanpa nama fungsi.
Takrifan fungsi boleh dibahagikan secara kasar kepada tiga cara:
Jenis pertama: Ini juga merupakan jenis yang paling biasa
function double(x){ return 2 * x; }
Kaedah kedua: Kaedah ini menggunakan pembina Fungsi dan menganggap kedua-dua senarai parameter dan badan fungsi sebagai rentetan Ini sangat menyusahkan dan tidak disyorkan.
var double = new Function('x', 'return 2 * x;');
Jenis ketiga:
var double = function(x) { return 2* x; }
Perhatikan bahawa fungsi di sebelah kanan "=" ialah fungsi tanpa nama Selepas mencipta fungsi, fungsi itu diberikan kepada petak pembolehubah.
Penciptaan fungsi tanpa nama
Kaedah pertama ialah mentakrifkan fungsi segi empat sama seperti yang dinyatakan di atas, yang juga merupakan salah satu kaedah yang paling biasa digunakan.
Cara kedua:
(function(x, y){ alert(x + y); })(2, 3);
Fungsi tanpa nama dicipta di sini (di dalam kurungan pertama), dan kurungan kedua digunakan untuk memanggil fungsi tanpa nama dan menghantar parameter. Tanda kurung ialah ungkapan, dan ungkapan mempunyai nilai pulangan, jadi anda boleh menambah sepasang kurungan selepasnya untuk melaksanakannya
Melaksanakan sendiri fungsi tanpa nama
1. Apakah fungsi tanpa nama yang dilaksanakan sendiri?
Ia merujuk kepada fungsi yang kelihatan seperti ini: (function {// code})();
2. Soalan
Mengapa (fungsi {// kod})(); boleh dilaksanakan, tetapi fungsi {// kod}();
3. Analisis
(function {// code}) ialah ungkapan, function {// code} ialah pengisytiharan fungsi.
(2). Kedua, ciri-ciri js "precompilation":
Dalam fasa "pra-penyusun" js, pengisytiharan fungsi akan ditafsirkan, tetapi ungkapan akan diabaikan.
(3). Apabila js melaksanakan function() {//code}();, kerana function() {//code} telah ditafsirkan dalam peringkat "precompilation", js akan melangkau function(){/ /code}, cuba melaksanakan ();, jadi ralat akan dilaporkan;
Apabila js melaksanakan (fungsi {// kod})();, kerana (fungsi {// kod}) ialah ungkapan, js akan menyelesaikannya untuk mendapatkan nilai pulangan Memandangkan nilai pulangan ialah fungsi, ia menemui () ;, ia akan dilaksanakan.
Selain itu, kaedah menukar fungsi kepada ungkapan tidak semestinya bergantung pada operator pengelompokan () Kita juga boleh menggunakan operator void, ~ operator, operator...
Contohnya:
!function(){ alert("另类的匿名函数自执行"); }();
Fungsi tanpa nama dan penutupan Perkataan bahasa Inggeris untuk penutupan ialah penutupan, yang merupakan bahagian pengetahuan yang sangat penting dalam JavaScript, kerana penggunaan penutupan boleh mengurangkan jumlah kod kami, menjadikan kod kami kelihatan lebih jelas, dsb. Pendek kata, ia sangat berkuasa.
Maksud penutupan: Secara terang-terangan, penutupan ialah sarang fungsi Fungsi dalam boleh menggunakan semua pembolehubah fungsi luar, walaupun fungsi luar telah dilaksanakan (ini melibatkan rantaian skop JavaScript).
function checkClosure(){ var str = 'rain-man'; setTimeout( function(){ alert(str); } //这是一个匿名函数 , 2000); } checkClosure();
Gunakan penutupan untuk mengoptimumkan kod:
function forTimeout(x, y){ alert(x + y); } function delay(x , y , time){ setTimeout('forTimeout(' + x + ',' + y + ')' , time); } /** * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰 * function delay(x , y , time){ * setTimeout( * function(){ * forTimeout(x , y) * } * , time); * } */
var oEvent = {}; (function(){ var addEvent = function(){ /*代码的实现省略了*/ }; function removeEvent(){} oEvent.addEvent = addEvent; oEvent.removeEvent = removeEvent; })();
Kami mahu menggunakan kod ini:
oEvent.addEvent(document.getElementById('box') , 'click' , function(){}); var rainman = (function(x , y){ return x + y; })(2 , 3); /** * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。 * var rainman = function(x , y){ * return x + y; * }(2 , 3);
var outer = null; (function(){ var one = 1; function inner (){ one += 1; alert(one); } outer = inner; })(); outer(); //2 outer(); //3 outer(); //4
Perhatian 1 Penutupan membenarkan fungsi dalaman merujuk kepada pembolehubah dalam fungsi induk, tetapi pembolehubah ialah nilai akhir
你会发现当鼠标移过每一个
解决方法一:
var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ (function(index){ lists[ index ].onmouseover = function(){ alert(index); }; })(i); }
解决方法二:
var lists = document.getElementsByTagName('li'); for(var i = 0, len = lists.length; i < len; i++){ lists[ i ].$$index = i; //通过在Dom元素上绑定$$index属性记录下标 lists[ i ].onmouseover = function(){ alert(this.$$index); }; }
解决方法三:
function eventListener(list, index){ list.onmouseover = function(){ alert(index); }; } var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ eventListener(lists[ i ] , i); }
2 内存泄露
使用闭包十分容易造成浏览器的内存泄露,严重情况下会是浏览器挂死