亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript學習筆記(四)function函數部分

2019-11-20 14:04:31
字體:
來源:轉載
供稿:網友

函數是由事件驅動的或者當它被調用時執行的可重復使用的代碼塊。
Jscript 支持兩種函數:一類是語言內部的函數(如eval() ),另一類是自己創建的。

在 JavaScript 函數內部聲明的變量(使用 var)是局部變量,所以只能在函數內部訪問它。(該變量的作用域是局部的)。

您可以在不同的函數中使用名稱相同的局部變量,因為只有聲明過該變量的函數才能識別出該變量。

函數的調用方式

1、普通調用:functionName(實際參數...)

2、通過指向函數的變量去調用:  

var  myVar = 函數名;

myVar(實際參數...);

返回函數的函數

  1. 當函數無明確返回值時,返回的值就是"undefined"。

  2. 當函數有返回值時,返回值是什么就返回什么。

我們可以通過使用 return 語句實現將函數返回調用它的地方。

在使用 return 語句時,函數會停止執行,并返回指定的值。

函數通常會返回一個唯一值,那么這個值也可能是另一個函數:

復制代碼 代碼如下:

<script type="text/javascript">
    var box = function(){
        var a=1;
        return function(){
            alert(a++)
        }
    }
    alert(box());//彈出"function(){alert(a++)}"
 </script>

在這里,我們只需將返回值賦值給某個變量,然后就可以像使用一般函數那樣調用它了:

復制代碼 代碼如下:

<script type="text/javascript">
    var box = function(){
        var a=1;
        return function(){
            alert(++a)
        }
    }
    var newFunc = box();
    newFunc();//2
 </script>

如果想讓返回的函數立即執行,亦可以使用box()()來執行這段代碼。

ECMAScript所有函數的參數都是按值傳遞的,言下之意就是參數不會按引用傳遞。

PS:如果存在按引用傳遞的話,那么函數里的那個變量將會是全局變量,在外部也可以訪問。

(1)值類型:數值、布爾值、null、undefined。
(2)引用類型:對象、數組、函數。

引用類型值:指的是那些保存在堆內存中的對象,意思是,變量中保存的實際上只是一個指針,這個指針執行內存中的另一個位置,由該位置保存對象;
創建匿名函數

復制代碼 代碼如下:

function(){
return ‘Lee';     //單獨的匿名函數是無法運行的,就算能運行也無法調用,因為沒有名字
}

這種匿名函數的用法在JQuery中非常多。直接聲明一個匿名函數,立即使用。用匿名函數的好處就是省得定義一個用一次就不用的函數,而且免了命名沖突的問題,js中沒有命名空間的概念,因此很容易函數名字沖突,一旦命名沖突以最后聲明的為準。

通過自我執行來執行匿名函數:

復制代碼 代碼如下:

//通過自我執行來執行匿名函數

<script type="text/javascript">
  (function (){         // (匿名函數)();第一圓括號放匿名函數,第二個圓括號執行
       alert('Lee');
  })();
</script>

把匿名函數自我執行的返回值賦給變量:

復制代碼 代碼如下:

//把匿名函數自我執行的返回值賦給變量

    <script type="text/javascript">
    var box =  (function (){          
           alert('Lee');
      })();         //彈出”Lee”;
    alert(box);   //彈出 undefined,如果寫出alert(box()),那么只會彈出一個"Lee"  
    </script>

自我執行匿名函數的傳參:

復制代碼 代碼如下:

//自我執行匿名函數的傳參

    <script type="text/javascript">
    (function (age){
     alert(age);
    })(100);          //彈出100
    </script>

javascript創建動態函數:

  JavaScript支持創建動態函數,動態函數必須用Function對象來定義(Function是javascript中的一個對象,是固定不變的,規定Function對象的"F"必須大寫,當是function的時候,我們知道是定義函數的時候所使用的一個關鍵字:function funName(x,y),當是Function的時候(F大寫的時候),我們知道是javascript中的對象)

創建動態函數的基本格式:var 變量名 = new Function("參數1","參數2","參數n","執行語句");
看下面的一段代碼:

復制代碼 代碼如下:

    <script type="text/javascript">
            var square = new Function ("x","y","var sum ; sum = x+y;return sum;");
             alert("square(2,3)的結果是:"+square(2,3));  //square(2,3)的結果是:5
    </script>

square是動態創建的函數,在Function對象后面的括號里的每一部分內容都必須是字符串形式的,也就是說都必須用引號(""或者是'')括起來

這段代碼:

var square = new Function ("x","y","var sum ; sum = x+y;return sum;");
和下面這段代碼:

復制代碼 代碼如下:

function square (x,y){
          var sum;
          sum = x+y;
          return sum;
     }

是一摸一樣的,只不過一個是動態函數,一個是靜態函數。
我們為什么要把代碼分成一小段一小段的代碼呢?,把一個字符串分成了若干個獨立的字符串的優點就在于我們可以通過修改其中的某些字符串來隨時改變函數的作用。

回調函數

回調就是一個函數的調用過程。那么就從理解這個調用過程開始吧。函數a有一個參數,這個參數是個函數b,當函數a執行完以后執行函數b。那么這個過程就叫回調。

其實中文也很好理解:回調,回調,就是回頭調用的意思。函數a的事先干完,回頭再調用函數b。

這里必須清楚一點:函數b是你以參數形式傳給函數a的,那么函數b就叫回調函數。

在jquery里的絕大多數效果函數都涉及到callback函數。jquery效果函數
例如:

復制代碼 代碼如下:

<script type="text/javascript">
        $("div").show(1000,function(){
            //callback function
        });
</script>

這里的callback function換成實例可以是:

復制代碼 代碼如下:

<script type="text/javascript">
    $("div").show(1000,function(){
        console.log("hello world")
    });
</script>

Callback實際上是,當一個函數執行完后,現執行的那個函數就是所謂的callback函數。怎么樣?很好理解吧……

方法和函數的區別

復制代碼 代碼如下:

var arr = [1,2,3,4,5]
var a =12;   // 變量:自由的
arr.a= 5;     //屬性:屬于一個對象
function show()     //函數:自由的
{
     alert(‘a');
}
arr.fn = function()   //方法:屬于一個對象
{
     alert(‘b');
}

其實方法就是函數,只不過方法是有所屬的對象。

我們所熟知的,將函數綁定到 click 事件
語法:

$(selector).click(function)
參數 描述
function 可選。規定當發生 click 事件時運行的函數。
這種形式在jquery中經常見到。它是將function當做該方法的參數,向該方法添加一個事件處理函數。

js全局函數

全局函數與內置對象的屬性或方法不是一個概念。全局函數它不屬于任何一個內置對象。
JavaScript 中包含以下 7 個全局函數,用于完成一些常用的功能:

escape( )、eval( )、isFinite( )、isNaN( )、parseFloat( )、
parseInt( )、unescape( )。
函數的幾個作用

作為一個類構造器使用

復制代碼 代碼如下:

function class(){}
class.prototype={};
var item=new class();

作為閉包使用

復制代碼 代碼如下:

(function(){
//獨立作用域
})();

作為構造函數調用

所謂構造函數,就是通過這個函數生成一個新對象(object)。

復制代碼 代碼如下:

<script type="text/javascript">
        function test(){
            this.x = 10;
        }

        var obj = new test();
        alert(obj.x); //彈出 10;
 </script>

可以使用 new 運算符結合像 Object()、Date() 和 Function() 這樣的預定義的構造函數來創建對象并對其初始化。面向對象的編程其強有力的特征是定義自定義構造函數以創建腳本中使用的自定義對象的能力。創建了自定義的構造函數,這樣就可以創建具有已定義屬性的對象。下面是自定義函數的示例(注意 this 關鍵字的使用)。

復制代碼 代碼如下:

function Circle (xPoint, yPoint, radius) {
    this.x = xPoint;  // 圓心的 x 坐標。
    this.y = yPoint;  // 圓心的 y 坐標。
    this.r = radius;  // 圓的半徑。
}

調用 Circle 構造函數時,給出圓心點的值和圓的半徑(所有這些元素是完全定義一個獨特的圓對象所必需的)。結束時 Circle 對象包含三個屬性。下面是如何例示 Circle 對象。

var aCircle = new Circle(5, 11, 99);
使用構造器函數的好處在于,它可以再創建對象時接收一些參數。

復制代碼 代碼如下:

<script type="text/javascript">
    function Test(name){
        this.occupation = "coder";
        this.name = name;
        this.whoAreYou = function(){
            return "I'm " + this.name + "and I'm a " + this.occupation;
        }
    }
    var obj = new Test('trigkit4');//利用同一個構造器創建不同的對象
    var obj2 = new Test('student');

    obj.whoAreYou();//"I'm trigkit4 and I'm a corder"
    obj2.whoAreYou();//"I'm student and I'm a corder"   
 </script>


依照慣例,我們應該將構造器函數的首字母大寫,以便顯著地區別于一般的函數。

以下兩種形式的定義函數方式是等價的。

復制代碼 代碼如下:

<script type="text/javascript">
    var test = function(){
        alert("Hello World");
    }
    alert(typeof(test));//output function
</script>

這里明確定義了一個變量test,他的初始值被賦予了一個function實體

復制代碼 代碼如下:

<script type="text/javascript">
    function test(){
        alert("Hello World");
    }
    alert(typeof(test));//output function
</script>

看看下面這種定義式函數形式:

復制代碼 代碼如下:

<script type="text/javascript">
        function test(){
            alert("Hello World");
        };
        test();//居然輸出Hello,很奇怪不是嗎?

        function test(){
            alert("Hello");
        };
        test();//正常滴輸出了Hello
</script>

很顯然,第一個函數并沒有起到作用,很奇怪不是嗎?我們知道,javascript解析引擎并不是一行一行地執行代碼,而是一段一段地執行代碼。在同一段程序的分析執行中,定義式的函數語句會被優先執行,所以第一個定義的代碼邏輯已經被第二個覆蓋了,所以兩次調用相同函數,只會執行第二個。

作為值的函數

函數在js中不僅是一種語法,也是一個值。也就是說可以將函數賦值給變量,存儲在對象的屬性或數組的元素中,作為參數傳入另一個函數中。
函數的名字實際是看不見的,它僅僅是變量的名字,這個變量指代函數對象

復制代碼 代碼如下:

<script type="text/javascript">
     function square(x,y){
         return x*y;
     }
     var s = square; //s和square指代同一個函數
     square(2,3);//6
     s(2,4);//8
</script>

除了可以將函數賦值給變量,同樣可以將函數賦值給對象的屬性,當函數作為對象的屬性調用時,函數就稱為方法

復制代碼 代碼如下:

<script type="text/javascript">
     var obj = {square:function(x,y){ //對象直接量
         return x*y;
     }};
     var ect = obj.square(2,3);
</script>

prototype屬性

每一個函數都包含prototype屬性,這個屬性指向一個對象的引用,這個對象稱為原型對象。
詳見:javascript學習筆記(五)原型和原型鏈

高階函數

這里的高階函數可不是高數里的那個高階函數,所謂高階函數就是操作函數的函數,它接收一個或多個函數作為參數,并返回新函數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩专区发布| 精品国产乱码久久久久久虫虫漫画| 欧美中文字幕视频在线观看| 欧美性极品xxxx做受| 成人444kkkk在线观看| 伊人久久久久久久久久久久久| 国产精品久久久久免费a∨大胸| 久久精品在线播放| 中文在线资源观看视频网站免费不卡| 欧美日韩亚洲视频| 色一区av在线| 成人97在线观看视频| 亚洲加勒比久久88色综合| 久久天天躁狠狠躁夜夜躁2014| 77777少妇光屁股久久一区| 欧美成人精品三级在线观看| 亚洲人成啪啪网站| 精品国产乱码久久久久酒店| 91精品国产91久久久久久不卡| 日韩精品中文字幕在线观看| 日韩中文在线中文网在线观看| 色噜噜狠狠狠综合曰曰曰88av| 国产主播精品在线| 国产成人一区二区三区电影| 欧美成人免费视频| 亚洲黄色www网站| 国产精品美腿一区在线看| 亚洲欧洲一区二区三区在线观看| 国产精品999999| 大伊人狠狠躁夜夜躁av一区| 98精品国产高清在线xxxx天堂| 国产精品亚洲片夜色在线| 亚洲精品午夜精品| 久久久久久久久久久av| 欧美成人在线免费| 久久久精品中文字幕| 国产精品v片在线观看不卡| 97精品视频在线| 国产成人精品一区二区在线| 亚洲精品福利免费在线观看| 正在播放国产一区| 国产精品久久久久久久久影视| 国产成人鲁鲁免费视频a| 日韩视频在线观看免费| 国产午夜精品全部视频在线播放| 久久九九热免费视频| 欧美日韩人人澡狠狠躁视频| 亚洲永久在线观看| 国产一区二区丝袜| 欧美成人合集magnet| 日韩精品免费看| 性色av一区二区三区在线观看| 狠狠色狠狠色综合日日小说| 日韩大片免费观看视频播放| 欧美大片在线看| 国产精品丝袜高跟| 疯狂蹂躏欧美一区二区精品| 免费不卡欧美自拍视频| 97在线看福利| 亚洲精品久久久久久久久久久| 色黄久久久久久| 亚洲精品国产suv| 韩国三级电影久久久久久| 国产精品免费一区二区三区都可以| 国产视频一区在线| 日韩精品视频在线播放| 92看片淫黄大片欧美看国产片| 久久久久久国产精品美女| 精品久久久久久久久久久久久| 国产精品九九九| 久久精品亚洲94久久精品| 伊人久久男人天堂| 亚洲精品美女在线观看播放| 成人网在线免费观看| 欧美午夜宅男影院在线观看| 色综合导航网站| 欧美成人中文字幕| 亚洲精品福利免费在线观看| 国产欧美va欧美va香蕉在| 亚洲欧美综合另类中字| 亚洲性av在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美福利在线观看| 精品久久中文字幕久久av| 亚洲美女喷白浆| 午夜精品一区二区三区在线| 91精品久久久久| 国内精品久久久久伊人av| 国产精品第一区| 精品久久久久国产| 日韩在线中文字| 日韩国产精品视频| 中文字幕国产精品久久| 97精品伊人久久久大香线蕉| 51视频国产精品一区二区| 久久6精品影院| 欧美精品亚州精品| 国产精品一区二区在线| 成人黄色大片在线免费观看| 中文字幕亚洲一区| 亚洲天堂影视av| 日韩高清电影好看的电视剧电影| 国内精品中文字幕| 日韩第一页在线| 日韩成人中文电影| 亚洲成色777777在线观看影院| 欧美激情视频在线观看| 在线观看久久久久久| 国产日韩精品在线观看| 亚洲免费电影在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久久久网站| 91手机视频在线观看| xxav国产精品美女主播| 69影院欧美专区视频| 欧美日韩激情美女| 欧美在线影院在线视频| 中文精品99久久国产香蕉| 国产欧美一区二区三区视频| 国产精品网红福利| 久久精品中文字幕一区| 欧美一区三区三区高中清蜜桃| 91免费国产视频| 久久久精品2019中文字幕神马| 欧美亚洲另类制服自拍| 国产69久久精品成人| 欧美激情中文字幕在线| 欧美人交a欧美精品| 日韩成人小视频| 成人欧美一区二区三区在线湿哒哒| 国产成人综合精品在线| 欧美日韩第一视频| www.99久久热国产日韩欧美.com| 精品无码久久久久久国产| 中文字幕最新精品| 欧美在线视频在线播放完整版免费观看| 久久这里只有精品视频首页| 亚洲国产精品高清久久久| 亚洲国产99精品国自产| 欧美国产亚洲视频| 国产激情久久久久| 中文欧美在线视频| 欧美综合第一页| 欧美高清第一页| 亚洲精品色婷婷福利天堂| 美女av一区二区三区| 欧美一级淫片丝袜脚交| 成人欧美一区二区三区黑人| 国产精品日韩欧美大师| 18一19gay欧美视频网站| 欧美视频专区一二在线观看| 欧美黑人视频一区| 亚洲欧美日韩天堂一区二区| 亚洲国产欧美自拍| 国产精品九九久久久久久久| 亚洲电影第1页| 九九热精品视频在线播放| 欧美国产日产韩国视频| 久久99久国产精品黄毛片入口| 91tv亚洲精品香蕉国产一区7ujn| 成人精品一区二区三区电影免费| 亚洲欧洲一区二区三区久久| 久久夜色精品亚洲噜噜国产mv| 亚洲电影免费观看高清完整版|