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