javascript
JavaScript学习记录四
案例:斐波那契數列
<script>//求斐波那契數列,12---144//1 1 2 3 5 8 13 21 34 55 89 144function getFib(num) {var num1=1;var num2=1;var sum=0;for(var i=3;i<=num;i++){sum=num1+num2;num1=num2;num2=sum;}return sum;}console.log(getFib(12));</script>arguments的使用:定義一個函數,如果不確定用戶是否傳入了參數,或者說不知道用戶傳了幾個參數
function f1() {//arguments----->數組使用------偽數組---var sum=0;for(var i=0;i<arguments.length;i++){sum+=arguments[i];}return sum;}console.log(f1(10,20,30));命名函數:函數如果有名字,就是命名函數
???? * 把一個函數給一個變量,此時形成了函數表達式
???? * 例子:
???? * var f1=function (){
???? *
???? * };
???? * 如果是函數表達式,那么此時前面的變量中存儲的就是一個函數,而這個變量就相當于是一個函數,就可以直接加小括號調用了
???? * f1();
???? *
???? * 注意:
???? * 函數表達式后面,賦值結束后,要加分號
匿名函數:函數如果沒有名字,就是匿名函數
???? 函數的自調用,沒有名字,調用---聲明的同時,直接調用
??? //一次性的--------
??? //??? (function(){console.log("阿姆斯特朗回旋加速");})();? 自動調用并進行打印
??? //??? //函數表達式
??? //??? var f2 = function () {
??? //????? console.log("哈哈,真的好帥哦");
??? //??? };
??? //??? //匿名函數不能直接調用(這里指的是沒有進行var f2=這樣的操作)
??? //??? f2();
function 類型
<script>function f1() {console.log("我是函數");}//如何獲取某個變量的類型? typeofconsole.log(typeof f1);//函數是有數據類型,數據類型:是function 類型的</script>回調函數
??? //函數可以作為參數使用,如果一個函數作為參數,那么我們說這個參數(函數)可以叫回調函數
??? //只要是看到一個函數作為參數使用了,那就是回調函數
函數是可以作為返回值使用的
<script>//結論:函數是可以作為返回值使用的:function f1() {console.log("f1函數調用了");return function () {console.log("這是一個函數");};}var ff=f1();//調用//ff就是一個函數了ff();</script>作用域:使用范圍
??? * 全局變量:聲明的變量是使用var聲明的,那么這個變量就是全局變量,全局變量可以在頁面的任何位置使用
??? * 除了函數以外,其他的任何位置定義的變量都是全局變量
??? * 局部變量:在函數內部定義的變量,是局部變量,外面不能使用,局部變量使用匿名全局變量修飾(num=10),函數調用后外部可以進行訪問,下邊第二個代碼段說明該點。
??? * 全局變量,如果頁面不關閉,那么就不會釋放,就會占空間,消耗內存
??? *
??? * 全局作用域:全局變量的使用范圍
??? * 局部作用域:局部變量的使用范圍
??? *
??? * 塊級作用域:一對大括號就可以看成是一塊,在這塊區域中定義的變量,只能在這個區域中使用,但是在js中在這個塊級作用域中定義的變量,外面也能使用;
??? * 說明:js沒有塊級作用域,只有函數除外
??? *
??? * 隱式全局變量:聲明的變量沒有var,就叫隱式全局變量
??? * 全局變量是不能被刪除的,隱式全局變量是可以被刪除的
??? * 定義變量使用var是不會被刪除的,沒有var是可以刪除的
作用域鏈:想鏈條一樣連接,被包含函數中無法調用包含函數中定義的變量
<script>var num=10;function f1() {var num=20;function f2() {console.info(num);//undefinedvar num=30;function f3() {var num=50;console.log(num);//50}f3();}f2();}f1();</script>預解析
??? * 把變量的聲明提前了----提前到當前所在的作用域的最上面
??? * 函數的聲明也會被提前---提前到當前所在的作用域的最上面
? 注意:
??? //預解析中,變量的提升,只會在當前的作用域中提升,提前到當前的作用域的最上面
??? //函數中的變量只會提前到函數的作用域中的最前面,不會出去
??? //預解析會分段(多對的script標簽中函數重名,預解析的時候不會沖突),一個script中允許出現同名函數,但是預解析會存在覆蓋,最好避免同名函數的使用。
??? //與java語言不同,函數的調用只根據函數名來進行區分,與參數無關,同名參數存在覆蓋
??? //匿名函數不存在預解析,必須聲明然后再進行調用,否則會直接報錯。
<script>console.log(num);//①沒有聲明,直接報錯的//分割線-----------------------------------console.log(num);//②顯示undefined,因為預解析,將變量的聲明提升,但是未進行賦值即:var num;var num=10;//分割線-----------------------------------f1();//函數調用的時候,把會函數的聲明提升到作用域的上面function f1(){console.info("函數調用的時候,把會函數的聲明提升到作用域的上面");}//分割線-----------------------------------function f1() {console.log("小蘇好猥瑣");}f1();function f1() {console.log("小蘇沒有助教猥瑣");}f1();//執行結果是輸出了兩次"小蘇沒有助教猥瑣":第一IC調用的使用預解析,將下邊的f1提前了,所以兩次調用都使用的第二個f1函數。//分割線-----------------------------------f1();//var num=20; 如果這里加一個聲明,輸出結果還是undefined,變量的使用還是有就近原則的,這里使用了為進過初始化的num.function f1(){console.info(num);//undefined:說明預解析提前了聲明但是未賦值var num=10;}//分割線-----------------------------------f1();var num=20; 輸出結果還是undefined,方法調用在聲明之前,預解析方法聲明提前,此時num還未初始化。function f1(){console.info(num);//undefined:預解析提前} </script>?
總結
以上是生活随笔為你收集整理的JavaScript学习记录四的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用gitee(码云)提交,拉取管理
- 下一篇: 蓝宝石英语怎么读,sapphire是什么