//咱們在求一個10的階乘的時候,可能會這麼作 //寫一個循環 var total = 1 for(var i=10; i>=1; i++){ total *= i ; } 這樣的for循環簡單直接。。。你們都會寫 可是,咱們能夠寫一個函數,遞歸調用 //遞歸函數 function jiecheng( n ){ if ( 1===n) return 1 return n*jiecheng(n-1) } //調用遞歸函數 var total = jiecheng(10)
ps:兩種不一樣的方法,雖然結果都相同,可是仍是有區別的。遞歸併無經過for循環遍歷每個數,並且代碼量變少了,看起來有點高大上。javascript
遞歸的缺點:html
//定義全局變量 var a =1; //函數體定義變量 function fun(){ var b =1; } //代碼塊裏定義變量 { var c = 1 { var d = 'rainbow' } } //for函數裏的變量 for( var i = 0 ; i<10 ;i++){ console.log(i) } console.log( a , c , d , i )//1 1 "rainbow" 10 console.log(b)//error
ps:上面代碼能夠看出來,在JavaScript裏,除了方法體內的變量未局部變量,其餘的都是全局變量,那若是咱們想要訪問函數裏面的變量該怎麼辦呢??
這個時候,咱們就要用到閉包了。java
function outer(){ var num = 10; funtion inner(){ console.log(num) } return inner; } var fun = outer() fun()//10 或者 function outer() { var age = 20; return function () {//匿名函數 return age; } } var age1 = outer(); console.log(age1())//20
總結:閉包,就是在函數內部定義一個函數,把function裏私有的屬性,經過這個內部函數返回給了外面。
特色:面試
閉包的缺點:瀏覽器
可能我本身講的不夠全,你們看看大佬的文章數據結構
完全理解閉包
http://www.javashuo.com/article/p-oqlutxhq-o.html
阮一峯老師的
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html閉包
回調函數有個比較逼格的名字——句柄。咱們只要知道有這麼個官方的叫法就行,之後面試或者交流的時候,也不至於聽不懂這是啥東西。
簡單理解就是,把一個函數看成參數。那麼這個函數就是回調函數。
那爲啥叫回調呢?
那是由於你執行一個方法時候,還不可以預期或者肯定會有什麼樣的結果,必須得再回過頭來調用這個函數(也就是傳的參數),獲得具體的結果。異步
function fun(callback){ console.log(callback) } //把一個方法看成參數 function say (value) { alert(value); } alert(say); alert(say('hi js.'));
ps:回調函數應用場景多用在使用 js 寫組件時,尤爲是組件的事件不少都須要回調函數的支持。函數
其實,咱們js的類庫提供了不少的函數,好比常常用的console.log(),alert()等等。可是在還未學習面向對象以前,主要來了解兩個內置函數,定時器setTimeout和setInterval學習
//使用方法 setTimeout(callback,delay); setInterval(callback,delay); function callback(){ console.log('rainbow'); } var delay = 1*1000; //解釋一下 callback:定時器要執行的方法 delay:定時器執行方法的間隔。單位ms毫秒
setTimeout、setInterval區別
那麼如何中止定時器呢?
每一個定時器都會返回一個定時器id,這個id在線程池中存着,咱們接收他的id,而後清除
//接收id var id1 = setTimeout(callback,delay); var id2 = setInterval(callback,delay); //關閉定時器 clearTimeout(id1) clearInterval(id2)
ps:
其實,學習定時器的時候,咱們就應該瞭解一下,js裏只有單線程,並且理論是沒有異步操做的,你們口中說的那是模擬異步,那麼你們就須要瞭解一個叫作任務隊列的東西。
說到這裏,咱們就來講三個任務,其實還有不少的:
謝謝你們能讀完這篇隨筆,鄙人學識淺薄,不少地方講的自認爲不是很深刻,也比較的俗,見諒見諒...