一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

05.JS函數(shù)

 怡紅公子0526 2020-08-05

前言:
學習一門編程語言的基本步驟
(01)了解背景知識
(02)搭建開發(fā)環(huán)境
(03)語法規(guī)范
(04)常量和變量
(05)數(shù)據(jù)類型
(06)數(shù)據(jù)類型轉(zhuǎn)換
(07)運算符
(08)邏輯結(jié)構(gòu)
(09)函數(shù)
9.函數(shù)——function
   1.函數(shù)
     函數(shù)分為系統(tǒng)函數(shù)和自定義函數(shù)
     JS提供的函數(shù)—isNaN/parseInt/parseFloat/Number/prompt...
     function:功能體,函數(shù)(方法),可以接收若干個數(shù)據(jù),返回處理結(jié)果。用于封裝反復執(zhí)行的代碼。
     1)創(chuàng)建一個普通函數(shù)
         function 函數(shù)名稱(){  //名字可以自定義
         函數(shù)體  //要封裝的代碼
         }
         //調(diào)用
         函數(shù)名稱();

    //function普通函數(shù)
    function say(){
      console.log("hello");
      console.log("javaScript");
      console.log("hello is me");
    }
    say ();//調(diào)用函數(shù)打印上述文字

    //練習:封裝計算1-100之間1-100的和
    function R(){
      for (var i=1,sum=0;i<=100 ;i++ ){
        sum+=i;//for循環(huán)運算
      }    
      console.log(sum);//最后是打印sum
    }
    R();//所以調(diào)用r之后打印sum,結(jié)果為5050

     2)創(chuàng)建帶有參數(shù)的函數(shù) ——function-param
         function 函數(shù)名稱(參數(shù)列表){ //參數(shù)列表用于接受傳遞的數(shù)據(jù)
         函數(shù)體;
         }
         //調(diào)用
         函數(shù)名稱(參數(shù)列表)//實際傳遞的數(shù)據(jù)
         參數(shù):創(chuàng)建函數(shù)時的參數(shù)成為形參,調(diào)用時參數(shù)成為實參,實參會賦值給形參,多個參數(shù)之間用逗號隔開。參數(shù)可以有0個或者多個,如果參數(shù)未被賦值,值為undefined。

    //function有參數(shù)函數(shù)
    //計算任意兩個數(shù)字相加的和
    function add(var1,var2){//參數(shù):形參——參數(shù)形式
      console.log(var1+var2);
    }
    //調(diào)用
    add(2,3);//參數(shù):實參——實際接收的參數(shù)

    //練習:創(chuàng)建函數(shù),封裝計算1-任意數(shù)字之間所有整數(shù)的和,調(diào)用多次
    function getsum(b){
      for (i=1,sum=0; i<=b;i++ ){
        sum+=i;
      }
      console.log(sum);
    }
    getsum(100);
    getsum(1004);
    getsum(10042);

    //練習:創(chuàng)建函數(shù),封裝計算任意兩個年份之間閏年的個數(shù),調(diào)用多次
    function runnian(year,year2){
      for (i=year,count=0;i<=year2 ;i++ ){
        if (i%4===0 && i%100!==0 || i%400===0 ){
        count++;
        console.log(i,count);
        }
      }
    }
    runnian(1980,2000);
    runnian(1880,2100);

     3)創(chuàng)建帶有 返回值得函數(shù)——function-return
         function 函數(shù)名稱(參數(shù)列表){
         函數(shù)體;
         return 值;//返回值,函數(shù)執(zhí)行完返回的結(jié)果
         }
         //調(diào)用
         函數(shù)名稱(參數(shù)列表)
         注意事項: 如果函數(shù)中沒有return,或是return 中沒有加任何值,返回undefined;執(zhí)行完return后的代碼不會再執(zhí)行。
                         return 函數(shù):供外部使用的數(shù)據(jù),return后面的數(shù)據(jù)不會被執(zhí)行。 

    //function帶有返回值的函數(shù)
    function add(n1,n2){
      //返回n1+n2的結(jié)果,用于后期保存,可以理解為如果n1,n2如果有參數(shù)傳進來之后就執(zhí)行n1+n2,然后保存結(jié)果,以便于后續(xù)使用
      return n1+n2;
    }
    //把函數(shù)的結(jié)果保存下來
    var a=add(100,140);
    console.log("總成績?yōu)椋?+a);

    //練習:創(chuàng)建函數(shù),傳遞任意年份,返回是否為閏年,如果是返回true,不是返回false;打印該年天數(shù)
    function year(a){
      if (a%4===0  && a%100!==0 || a%400===0){
        return true;
    }//else {   可以省略
      return false;
    }
    function getdays(a){
      if(year(a)){//此處解釋為如果year(a)為真就執(zhí)行以下
        return a+"閏年,366天";
      }//此處省略else  否則
    return a+"不是閏年,365天";
    }
    console.log(getdays(2019));//2019不是閏年,365天

    //練習:計算1-任何數(shù)字之間所有整數(shù)階乘的和
    //1!+2!+3!+4!+5!
    //步驟一:計算任意數(shù)字的階乘n-1之間所有整數(shù)的乘積
    function R(a){
      for (var b=1,num=1;b<=a ; b++){
      num*=b;
      }
      return num;  
    }
    //R(4);
    //步驟2:計算1-n之間所有整數(shù)的和
    function getSum(a){
      for(var i=1,sum=0;i<=a;i++){
        sum+=R(i);
      }
      return sum;
    }
    console.log(getSum(5));//153

         總結(jié):對比break和return的用法
                  break用于結(jié)束switch語句,還可以用于提前結(jié)束循環(huán)。
                  return用于在函數(shù)中的返回值,也可以結(jié)束函數(shù)后續(xù)代碼執(zhí)行。

   2.作用域——scope
      變量或者函數(shù)的可訪問范圍,分兩種
      全局作用域:在全局使用var聲明的變量,可以在任意范圍訪問到,
      函數(shù)作用域:在函數(shù)中使用var聲明的變量,只能在函數(shù)內(nèi)部訪問到。

    //作用域——scope
    //全局作用域下的變量
    var a=1;//全局變量,在此處除function fn(){}函數(shù)以外就是全局。
    //函數(shù)作用域下使用var聲明的變量
    function fn(){
      var b=2;//局部變量
      console.log(a);//全局函數(shù)a可以在任意范圍訪問
      console.log(b);//2,局部變量可以在函數(shù)作用域內(nèi)訪問
    }
    console.log(a);//1
    fn();//1 調(diào)用函數(shù),執(zhí)行函數(shù)體代碼。
    console.log(b);//報錯,b is not defined

       注意事項:函數(shù)中不使用var聲明的變量,默認是全局變量,可以在函數(shù)的外部訪問,不推薦這樣寫。

    //注意事項
    function fn2(){
      c=3;//函數(shù)中不使用var聲明的變量默認是全局變量,不建議這么寫,造成全局污染
    }
    console.log(c);//即使c是包裹在函數(shù)內(nèi)部,但是沒有聲明的變量默認是全局變量,所以在函數(shù)外部是可以訪問的
    fn2();//而調(diào)用fn2()的時候內(nèi)部是什么都沒有寫的,相當于沒有任何函數(shù)體代碼

      1)變量提升
          JS程序執(zhí)行前,會將使用var關(guān)鍵字聲明的變量提升到所在作用域的最前邊,但是賦值還是在原來的位置。

    //變量提升——全局作用域
    var a=1;//聲明變量并賦值
    console.log(a);
    /***************** 實際在程序中應為 ****************/
    //變量提升——全局作用域
    var a;//聲明提前
    a=1;//var a=1中,聲明提前,但是賦值留在原地
    console.log(a);

    //變量提升——函數(shù)作用域
    function fn(){
      console.log(b);
      var b=2;
    }
    fn();
    /***************** 實際在程序中應為 ****************/
    //變量提升——函數(shù)作用域
    function fn(){
      var b;//變量提升到所在函數(shù)作用域前面
      console.log(b);//此時只聲明,沒有賦值,所以打印結(jié)果是undefined
      b=2;//賦值留在原地,
    }
    fn();//所以調(diào)用后結(jié)果是undefined

       2)函數(shù)的作用域
          函數(shù)的可訪問范圍,在全局作用域下創(chuàng)建的函數(shù)可以在任意位置訪問;在函數(shù)作用域下創(chuàng)建的函數(shù)只能在函數(shù)內(nèi)部訪問。

    //函數(shù)作用域
    var n=5,m=7;
    function fn2(){
    //var n;提升到所在作用域最前面,相當于此處有一個聲明變量,但是未賦值,只能在內(nèi)部訪問這個n
    console.log(n);//此時打印的n值為undefined,因為在函數(shù)作用域中var聲明提前到作用域最前面,
    var n=8;//此處的相當于正常為 n=8 給前面聲明的變量賦值,
    console.log(n);//此時打印的n值為8
    console.log(m);//函數(shù)作用域內(nèi)沒有m,調(diào)用全局的m
    }
    console.log(n);//此處打印的n值是全局作用域下的n,值為5
    fn2();//此處調(diào)用fn2

      3)函數(shù)提升
          和變量提升一樣,JS程序執(zhí)行前,會把function關(guān)鍵字創(chuàng)建的函數(shù)提升到坐在作用域的最前邊,在調(diào)用的時候才會執(zhí)行函數(shù)提升的代碼。

    //函數(shù)提升
    fn();//先調(diào)用,
    function fn(){
      console.log(1);    
    }
    /***************** 實際在程序中應為 ****************/
    function fn(){//提升到當前作用域最前端,先創(chuàng)建
      console.log(1);    
    }
    fn();//調(diào)用
  3.匿名函數(shù)
     沒有名稱的函數(shù) function(){ }
      1)創(chuàng)建函數(shù)
          function fn1(){ }——函數(shù)聲明
    //創(chuàng)建函數(shù)——函數(shù)聲明
    function fn1(){  }
    var a;
          var fn2=function(參數(shù)){ 函數(shù)體 }——函數(shù)表達式,變量名就是函數(shù)名稱
    //創(chuàng)建函數(shù)——函數(shù)表達式
    //變量名稱就是函數(shù)名稱
    var fn2=function(a,b){
      console.log(a+b);
    }
    fn2(1,3);

    //練習:使用函數(shù)表達式創(chuàng)建函數(shù),計算任意兩個數(shù)字之間所有整數(shù)的和
    //只能先創(chuàng)建在調(diào)用,因為不存在提升,
    var add=function(a,b){
      for (i=1,sum=0;i<=b ;i++ ){
      sum+=i;
      }
      return sum;
    }
    console.log(add(3,10));
          總結(jié):對比函數(shù)聲明與函數(shù)表達式的區(qū)別
                   函數(shù)聲明,創(chuàng)建函數(shù)存在提升,可以在任意位置創(chuàng)建,后調(diào)用。
                   函數(shù)表達式,使用變量創(chuàng)建,只存在變量的提升,不存在函數(shù)提升,只能先創(chuàng)建,再調(diào)用。

      2)匿名函數(shù)的自調(diào)用
          目的:創(chuàng)建函數(shù)作用域包裹起來,防止污染全局。
          (function(形參列表){
          //函數(shù)體中的變量不能被外部訪問
          })(實參列表);

    //匿名函數(shù)
    //避免全局污染,把變量放到函數(shù)作用域下
    (function(){//匿名函數(shù)可以自己調(diào)用自己函數(shù)內(nèi)的數(shù)據(jù),匿名函數(shù)需要用()()
      var num=2;
      console.log(num);
    })();

    (function(a,b){//匿名函數(shù)可以自己調(diào)用自己函數(shù)內(nèi)的數(shù)據(jù),匿名函數(shù)需要用()()
      var num=4;
      console.log(a+b);
    })(3,5);

      3)回調(diào)函數(shù)——callback
           把匿名函數(shù)以實參的形式傳遞,意味著形參就是傳遞的匿名函數(shù)的名稱
           function fn(a){
           //調(diào)用fn的時候,匿名函數(shù)賦值給參數(shù)a,a就是函數(shù)名稱
           a() //執(zhí)行傳遞的匿名函數(shù)體中的代碼。
           }

    //回調(diào)函數(shù)
    function fn(a){
    //實參賦值給形參
    //把匿名函數(shù)賦值給a,a就是函數(shù)名稱
    //a=function(){  }
    a();
    } 
    fn(function(){
      console.log(1);
      console.log(2);
    }); //調(diào)用函數(shù)a,執(zhí)行傳遞的函數(shù)體中的代碼

    //練習:創(chuàng)建函數(shù),傳遞兩個參數(shù),實參使用匿名函數(shù)的形式傳遞,在匿名函數(shù)的函數(shù)體中添加若干行代碼;在函數(shù)中執(zhí)行匿名函數(shù)中的代碼。
    function fun(a,b){
    a();
    b();
    };
    fun(function(){
      console.log(3);
    },function(){
        console.log(4);
    });

   4.全局函數(shù)——global
      parseInt()/parseFloat()/isNaN()/
      encodeURI() 對網(wǎng)址中的漢字進行編碼
      decodeURI() 對已經(jīng)編碼網(wǎng)址進行解碼
      isFinite()      判斷一個值是否為有限值,是—>true 不是-false
      eval()          可以執(zhí)行字符串中的表達式

    //全局函數(shù)
    //對一個網(wǎng)址中的中文編碼
    var str='http://www.jd.com/search?kw=電腦';
    var str2=encodeURI(str);
    console.log(str2);//http://www.jd.com/search?kw=%E7%94%B5%E8%84%91
    //對已經(jīng)編碼的網(wǎng)址進行解碼
    var str3=decodeURI(str2);
    console.log(str3);//http://www.jd.com/search?kw=電腦

    //isFinite判斷一個值是否為有限值。是—>true 不是-false
    //2/0-> Infinity(無窮) 0/2->0
    console.log(0/2,2/0);//0 Infinity
    console.log(isFinite(1/3));//true

    //eval可以執(zhí)行字符串中的表達式
    console.log("1+2");//1+2
    console.log(eval("1+2"));//3

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    四季精品人妻av一区二区三区 | 亚洲精品伦理熟女国产一区二区| 国产av精品一区二区| 91精品国自产拍老熟女露脸| 情一色一区二区三区四| 欧美成人精品一区二区久久| 一区二区三区在线不卡免费| 久热香蕉精品视频在线播放| 国产原创中文av在线播放| 又大又紧又硬又湿又爽又猛| 成人精品日韩专区在线观看 | 国产精品乱子伦一区二区三区| 国产永久免费高清在线精品| 久久热中文字幕在线视频| 国产在线一区中文字幕| 亚洲精品成人福利在线| 九九热在线视频精品免费| 东京热电东京热一区二区三区| 高清不卡一卡二卡区在线| 日韩精品一级片免费看| 91偷拍裸体一区二区三区| 国产成人精品一区二区在线看| 国产成人精品久久二区二区| 99久久精品午夜一区| 国产精品香蕉一级免费| 欧美日韩一区二区午夜| 欧美人妻少妇精品久久性色| 蜜桃传媒视频麻豆第一区| 国产麻豆精品福利在线| 国内自拍偷拍福利视频| 又大又长又粗又猛国产精品| 冬爱琴音一区二区中文字幕| 欧美多人疯狂性战派对| 日韩欧美综合在线播放| 亚洲av熟女国产一区二区三区站| 色婷婷在线视频免费播放| 久久国产精品亚州精品毛片| 日本大学生精油按摩在线观看| 一区二区三区免费公开| 日韩欧美中文字幕人妻| 日本欧美视频在线观看免费|