寫一個函數fnn(),使fnn(2,3)和fnn(2)(3)輸出的結果都為5
這道題目其實非常簡單,2和3只有在相加的情況下才等於5,所以,第一個fnn(2,3)要輸出5,最簡單的辦法就是直接把兩個參數在函數中相加即可
<script>
function fnn(a,b){
return a+b
}
console.log(fnn());
</script>
但是第二個,fnn(2)(3)其實這里用到了閉包。
什么是閉包,這個我們在這里就不詳細解釋了,大家可以去網上查一下一些大神的博客和文章,他們寫的東西比官方籠統的解釋要詳細的多。
簡單的說一句就是函數a里面嵌套着函數b,而且函數b也能訪問函數a里面的變量;
在這個題目上,fnn(2)(3),我們可以修改上面那個函數來實現等於5的結果
<script>
function fnn(a,b){
//首先通過條件判斷是否有2個參數,也就是形參b,如果有形參b,那么直接返回a+b,也就是第一種的fnn(2,3)
if(b){
return a+b
//如果沒有形參b,那么說明它只有一個參數
}else{
//首先先聲明一個變量b,將形參a的值賦值給b。
var b=a;
//然后返回一個函數,這里是返回一整個匿名函數,這里面的參數a就是fnn(2)(3),第二個括號里面的參數3,在這里,函數會自執行,類似於自執行函數,最后返回的結果還是2+3
return function(a){
return b+a
}
}
}
console.log(fnn()());
</script>
這只是一道很基礎的面試題,稍微了解閉包的人都能做出來,我發表這篇文章的目的並不是為了深入探討閉包的原理和功能,只是為了給剛接觸閉包的初學者們提供一個實例來幫助他們加深對閉包的理解。
