閉包與回調
下面看一道閉包的題目,分別點擊第一個和第四個節點,執行結果:
var nodes = document.getElementsByTagName('button'); for (var i = 0; i < nodes.length; i++) { nodes[i].addEventListener('click', function() { console.log('You clicked element #' + i); }); }
這里雖然主要考的是閉包,addEventListener是一個閉包,而匿名函數是一個回調函數,i是在閉包中的變量。在addEventListener的回調執行時,循環已經結束,此時的變量i被賦值為node.length,node.length為總節點數。所以結果就是
You clicked element # node.length
那要怎么改,將其返回值改成函數,既然i變量的值會被釋放,那我們就引入i,讓每次循環的值都保存在內存中,就可以了:
var nodes = document.getElementsByTagName('button'); for (var i = 0; i < nodes.length; i++) { (function(i) { nodes[i].addEventListener('click', function () { console.log('You clicked element #' + i); }) })(i); }
PHP回調函數
下面略說一下php中回調函數如何實現(結果為1,2,3,4):
<?php $array=array(1,2,3,4); array_walk($array,function($value){ echo $value;}); ?>
php對每個傳入的數組元素作回調處理,下面再看看php的閉包,使用use關鍵字繼承作用域外的變量:
<?php function getcouter(){ $i=0 return function() use($i)( echo $i; )}; } $counter=getcounter(); echo $counter(); echo $counter(); ?>
返回結果為:
1,1
1
官方php使用方法
class hello { function callback($a,$b) { echo "$a,$b"; } static function callback($c,$d){ echo "$c,$d"; } } //將類名作為參數 call_user_func(array('hello','callback'),"hello","world"); //
其實就原理來說,JS和php都是差不多的,都是先定義好函數,然后需要的時候就調用過來。
更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com