JavaScript-函數

1. JS函數的概念

  函數就是把特定功能的代碼抽取出來词爬,使之成為程序中的一個獨立實體。

2. 函數的作用

  正如函數的概念, 我們可以根據需要, 將特定的功能用函數來包裹(封裝)

3. 使用函數的好處

 1, 函數可以在同一個程序或其他程序中多次重復使用(通過函數名調用)
 2, 使程序變得更簡短而清晰 候学, 提高可讀性
 3, 有利于程序維護

4.函數的分類

函數可以分為: 系統(tǒng)函數 內置函數 和 自定義函數

系統(tǒng)函數,內置函數:
是官方提供好的函數翅雏,可以直接使用
如: alert(), isNaN(), console.log() 圈驼,document.write(), Boolean(), Math.pow()等

自定義函數:


函數的簡單定義
    定義函數的語法格式: 
     function  函數名() {
          代碼塊;
     }
注意:  
        1, 必須使用function關鍵字, 且為小寫, 函數名可以自己給定
        2, 函數名的命名規(guī)則和變量名一致
        3, 函數名后必須寫圓括號()

示例:   定義一個函數printOut
   function printOut(){
        document.write(“Hello World!”);
   }     

函數的標準定義
定義函數的語法格式:
function 函數名(參數1,參數2望几,……)
{
執(zhí)行語句;
return 返回值;
}
注意: 1, 函數名后圓括號()中的參數數量不定, 也可以沒有; (根據功能需要)
2, return關鍵字的作用是將某個值返回, 如果沒有返回值則默認返回undefined

5.函數的三種寫法

//普通函數
    function fn1(n,m) {
            return n+m;
    }

    console.log(fn1(10,20));

    //匿名函數(沒有函數名稱)
    var fn2=function(n,m) {
        return n+m;
    }
    console.log(fn2(10,20));

    //構造函數绩脆,創(chuàng)建函數
    var fn3= new Function("a","b","return a+b;")

    console.log(fn3(50,40))

6.函數的形參和實參

形參:
形參就是在函數定義時,函數名后面的參數;
函數的形參跟變量是一樣使用,且不能用var修飾
實參:
實參就是調用時橄抹,函數名后面的參數

如: 之前定義的函數sum中:  one和two是形參,   2和8是實參
 function sum(one, two){
      var s = one + two;
      return s;
 }
 sum(2, 8);

7.函數中的arguments數組:

JS中函數不介意傳遞進來多少個參數靴迫,也不在乎傳進來參數是什么數據類型,在調用函數時也未必一定要傳遞指定數量的參數楼誓,原因是 ECMAScript 中的參數在內部是用一個數組(arguments)來表示的玉锌。函數接收到的始終都是這個數組,而不關心數組中包含哪些參數(如果有參數的話)疟羹。

arguments可以判斷參數的個數主守,arguments是個數組。
我們可以使用arguments.length來獲取參數的個數
可以使用arguments[i] 的方式來訪問數組中的第i個參數(i為自己給定的整數下標)
<script>
    // arguments
    // 1.只能在函數內部出現(xiàn)
    // 2.它是偽數組(本質是一個對象)
    //     對象多一個length屬性
    //      它的作用:1動態(tài)接受實參

    // 動態(tài)接受實參
    function  fn() {
        var res=0;
        for(var i=0;i<arguments.length;i++) {
            res+=arguments[i];
        }
        return res;
    }

    var res1=fn(10,20,30);
    console.log(res1);

    var res2=fn(4,5,6,7);
    console.log(res2);

    // fn("大白兔","白又白")

    //對象不會天生自帶length
    //數組會自帶length
</script>

8.DOM的簡單操作

<body>
<input type="text" id="txt">
<button id="btn">提交</button>
</body>
<script>
    //想用js操作頁面上元素
    //通過id獲取文檔里的元素
    var oBtn = document.getElementById("btn");
    var oTxt = document.getElementById("txt");
    //console.dir 查看對象的詳細信息
    //. 的
    //console.log(oBtn);
    //頁面里面輸入的內容都是字符串型
    //1.拿到點擊按鈕榄融,給按鈕綁定點擊事件
    oBtn.onclick=function (){
        //2.在點擊事件里面参淫,獲取輸入框的值
        var res = oTxt.value;
        console.log(res);
    }
</script>

9.作用域

作用域:
就是起作用的范圍±⒈或者說有效范圍; 這里涉及到另外兩個概念

1.局部變量: 定義在函數內部的變量涎才,這個變量只能在函數內部使用,即作用域范圍只是函數內部力九,另外憔维,形參也是局部變量.

2.全局變量: 全局變量就是定義在函數外部的變量,這個變量在任何函數中都有效畏邢,即作用域范圍是當前文件的任何地方.

注意: 在定義變量時, 如果不寫關鍵字var也是合法的, 且是全局變量, 但是這樣寫不安全,容易在其他地方被更改, 所以我們在函數中寫變量要加上var
<script>

    //全局變量和局部變量业扒,同名并同時存在,局部變量優(yōu)先
    function fn(n) {
        m=10;//全局變量
    }

    fn(20)
        console.log(m);
        //console.log(n);

       var n=100;
    function fn() {
        console.log(n); //undefined 變量提升
        var n=200;
        console.log(n);//200
    }
    //變量提升是JavaScript 的一種執(zhí)行機制舒萎,大致就是字面意思程储,將聲明的變量提前,
    // 但并不是指在編譯時改變語句的順序臂寝,而是將變量 提前 放入內存中章鲤,供后續(xù)操作
    // 上面fn的執(zhí)行順序為fn{
    //     var n;
    //     console.log(n);     //所以n會輸出undefined
    //     n=200;
    // }

    fn();
    function fn() {
        var n=m=200;   //var n;所以n是一個局部變量咆贬,而m前面沒有var所以是全局變量
    }
    fn()
    console.log(n);// n is not defined
    console.log(m);//200

</script>

10.遞歸調用

遞歸調用:    函數可以自己調用自己,必須要有結束條件,稱為函數的遞歸調用;

重要性:
遞歸的分量败徊,遞歸屬于函數中比較難理解的知識,在應用開發(fā)中掏缎,雖然使用不是很頻繁皱蹦,但是很體現(xiàn)你的功底煤杀,而且,從事IT行業(yè)開發(fā)沪哺,最好要會遞歸沈自,如果說現(xiàn)在可以不要求靈活運用的話,以后到公司中一定要會辜妓,如果面試中有人問你遞歸枯途,說明,他對你要求挺高

10.函數執(zhí)行順序(函數提升)(易錯)

函數提升:
規(guī)則:
1.變量聲明籍滴,函數聲明都會被提升到作用域頂部酪夷;
2.當出現(xiàn)相同名稱函數時,優(yōu)先級:變量聲明<函數聲明<變量賦值

var foo = function(x,y) {
        return  x-y
}
var foo = function(x,y) {
        return  x+y
}
var num = foo(1,2)

javaScript編譯器處理后執(zhí)行順序

//variable hositing 變量提升
var foo;//foo#1
var num;

//function declaration hoisting 函數聲明提升
function foo(x,y){ //foo#2
        return x + y;
 }

//function expression NOT hoisted 函數表達式不會提升
function foo(x,y){ //foo#3
        return x - y;
 }

num = foo(1,2); 這里使用foo #3

———————————————————————————————————————————————

2021/10/27 更新

聲明式函數 和 賦值型函數

聲明函數與賦值函數的區(qū)別在于: 在 JS 的預編譯期間孽惰,聲明式函數會被先提取出來晚岭,然后才按照順序執(zhí)行 JS代碼。

聲明式函數:

a();  // 'a'
function a() {
  console.log('a');
}

賦值型函數:

b(); // Uncaught TypeError: b is not a function
var b = function() {
  console.log('b');
}

函數聲明 提前于 賦值函數灰瞻。

console.log(e); // undefined
var e;
console.log(f); //Uncaught ReferenceError: f is not defined
捕獲.JPG

———————————————————————————————————————————————

遞歸調用的方式:
  1. 首先去找臨界值腥例,即無需計算,獲得的值(一般是返回該值)酝润。
  2. 找這一次和上一次的關系(一般從后往前找)
  3. 假設當前函數已經可以使用燎竖,調用自身計算上一次的運行結果,再寫出這次的運行結果
var f = function (x) {
    if (x < 2) {
          return 1;//當x小于2時要销,函數會返回1构回;不再執(zhí)行else
      }  
    else {
          return x * f(x - 1); //遞歸調用
      } 
}
console.log(f(5));  //得到5的階乘是120
兔子問題

兔子繁殖問題,設有一只新生兔子疏咐,從第四個月開始他們每個月, 月初都生一只兔子,
// 新生的兔子從第四個月月初開始又每個月生一只兔子按此規(guī)律纤掸,并假定兔子沒有死亡,
// n(n<=20)個月月末共有多少只兔子?

      function f(n){
   if(n == 1 || n == 2){   // 輸入1和2時候浑塞,返回只有一對兔子
      return 1;
      }
   return f(n-1)+f(n-2);   //遞歸計算兔子數量
 };

 f(12);   //12個月后一共有144對兔子

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末借跪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酌壕,更是在濱河造成了極大的恐慌掏愁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵牍,死亡現(xiàn)場離奇詭異果港,居然都是意外死亡,警方通過查閱死者的電腦和手機糊昙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門辛掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人释牺,你說我怎么就攤上這事萝衩』赝欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵欠气,是天一觀的道長厅各。 經常有香客問我镜撩,道長预柒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任袁梗,我火速辦了婚禮宜鸯,結果婚禮上,老公的妹妹穿的比我還像新娘遮怜。我一直安慰自己淋袖,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布锯梁。 她就那樣靜靜地躺著即碗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陌凳。 梳的紋絲不亂的頭發(fā)上剥懒,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音合敦,去河邊找鬼初橘。 笑死,一個胖子當著我的面吹牛充岛,可吹牛的內容都是我干的保檐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼崔梗,長吁一口氣:“原來是場噩夢啊……” “哼夜只!你這毒婦竟也來了?” 一聲冷哼從身側響起蒜魄,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扔亥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后权悟,有當地人在樹林里發(fā)現(xiàn)了一具尸體砸王,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年峦阁,在試婚紗的時候發(fā)現(xiàn)自己被綠了谦铃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡榔昔,死狀恐怖驹闰,靈堂內的尸體忽然破棺而出瘪菌,到底是詐尸還是另有隱情,我是刑警寧澤嘹朗,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布师妙,位于F島的核電站,受9級特大地震影響屹培,放射性物質發(fā)生泄漏默穴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一褪秀、第九天 我趴在偏房一處隱蔽的房頂上張望蓄诽。 院中可真熱鬧,春花似錦媒吗、人聲如沸仑氛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锯岖。三九已至,卻和暖如春甫何,著一層夾襖步出監(jiān)牢的瞬間出吹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工沛豌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趋箩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓加派,卻偏偏與公主長得像叫确,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芍锦,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • 一竹勉、函數的概念 函數是一段可以反復調用的代碼塊。 作用:在程序設計中娄琉,常將一些常用的功能模塊編寫成函數次乓,以減少重復...
    MJ的小世界閱讀 146評論 0 1
  • 每天一句:想說會有多少人問自己一下幾個問題“你這輩子到底要什么票腰,要做怎么樣的人?你現(xiàn)在能夠做什么女气?你正在做什么杏慰?你...
    EndEvent閱讀 279評論 0 0
  • 每天一句:想說會有多少人問自己一下幾個問題“你這輩子到底要什么缘滥,要做怎么樣的人轰胁?你現(xiàn)在能夠做什么?你正在做什么朝扼?你...
    王梓懿_1fbc閱讀 155評論 0 0
  • 函數 理解參數 JavaScript函數不介意傳遞多少個參數赃阀,也不介意傳遞參數的數據類型。也就是說函數定義接受多少...
    TaoGeNet閱讀 209評論 0 2
  • JavaScript可以用關鍵字function來定義函數擎颖,函數的調用也不必放在函數聲明之后榛斯,因為JavaScri...
    權游一里閱讀 218評論 0 0