成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript-面向?qū)ο?Function類型

sugarmo / 1945人閱讀

摘要:在中,函數(shù)也是以對象的形式存在的,每個函數(shù)都是一個對象??梢远ㄒ荒硞€匿名函數(shù)執(zhí)行某些一次性任務(wù)。定義變量,但不初始化值函數(shù)作用域進(jìn)行初始化值一個函數(shù)閉包的作用提供可享的局部變量保護(hù)共享的局部變量,提專門讀寫變量的函數(shù)避免全局污染

Function與函數(shù)

Function是JavaScript提供的一種引用類型,通過Function類型創(chuàng)建Function對象。
在JavaScript中,函數(shù)也是以對象的形式存在的,每個函數(shù)都是一個Function對象。

//字面量方式創(chuàng)建函數(shù)
var fun =function () {
    console.log(100)
};

//函數(shù)聲明方式創(chuàng)建函數(shù)
function fn () {
    console.log(200)
};

/*     創(chuàng)建Funtion類型的對象
*       var 函數(shù)名 = new Function("參數(shù)",""函數(shù)體)*/
var f = new Function("a","console.log(a)");
f(2);//以函數(shù)方式調(diào)用
Function類型 Function的apply()方法

Function的apply()方法用于調(diào)用一個函數(shù),并且接受指定的this值,以及一個數(shù)組作為參數(shù)。

//定義函數(shù)
function fun(value) {
    console.log(value)
}
/*
函數(shù)的apply()方法——>用于調(diào)用一個函數(shù)
     函數(shù)名.apply(thisArg,[argsArray])
       thisArg——>可選項,函數(shù)運(yùn)行時使用的this值
       argsArray——>可選項,一個數(shù)組或者類數(shù)組對象,其中的元素作為多帶帶的參數(shù)傳給Function函數(shù)。*/
fun.apply(null,["100"]);
Function的call()方法

Function的call()方法用于調(diào)用一個函數(shù),并且接受指定的this值,以及參數(shù)列表。

var fun  = function (value,a,b,) {
    console.log(value,a,b,)
}
/*
*   call()方法調(diào)用函數(shù)
*   函數(shù)名.call(thisArg,arg1,arg2,…)
*
*   和apply()的區(qū)別在于提供參數(shù)的方式不同
*/
fun.call(null,2,3,4);//2 3 4
Function的bind方法

Function用于創(chuàng)造一個新的函數(shù),稱為綁定函數(shù),并且接受指定的this值作為參數(shù),以及參數(shù)列表

var fun = function (a,b,c) {
    console.log( a,b,c)
}
/*  bind方法->相當(dāng)于復(fù)制一份當(dāng)前函數(shù)
*   函數(shù)名.bind(thisArg,arg1,arg2,...)
*     thisArg->當(dāng)綁定函數(shù)被調(diào)用時,該屬性作為原函數(shù)運(yùn)行時的this指向
*     arg->參數(shù)。當(dāng)綁定函數(shù)被調(diào)用時,這些參數(shù)將在實參之前傳遞給被綁定的方法
*     */

var v =fun.bind(null,2,3,4);
v();//2 3 4
沒有重載

在其他開發(fā)語言中,函數(shù)有一種特性叫做重載。就是定義多個同名的函數(shù),但沒一個函數(shù)接收的參數(shù)個數(shù)不同,程序會根據(jù)調(diào)用時傳遞的實參個數(shù)進(jìn)行判斷,具體調(diào)用的是哪個函數(shù)。
單JavaScript中函數(shù)是沒有重疊現(xiàn)象的,如果定義多個同名的函數(shù),只有最后一個定義的函數(shù)是有效的。

arguments對象

雖然沒有重載,但是JavaScript提供了argumengs對象可以模擬函數(shù)重載的現(xiàn)象。

/*
*    argumengs對象
*    *該對象存儲當(dāng)前函數(shù)中所有的參數(shù)(實參)->類數(shù)組對象
*    *該對象一般用于函數(shù)中
*    *作用-用于獲取當(dāng)前函數(shù)的所有參數(shù)
*    *arguments.length->函數(shù)所有參數(shù)(實參)的個數(shù)*/
function fun() {
    var num = arguments.length;
    switch (num){
        case 2://參數(shù)個數(shù)
            return arguments[0]+arguments[1];
        break;
        case 3:
            return arguments[0]+arguments[1]+arguments[2];
        break;
    }
}
console.log(fun(4,5));//9
console.log(fun(4,5,6));//15
遞歸

在函數(shù)體內(nèi)調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。在某種意義上來說,遞歸近似于循環(huán)。兩者都重復(fù)執(zhí)行相同的代碼,都需要一個終止條件來避免無限循環(huán)和無限遞歸。
在一個函數(shù)體內(nèi),想要調(diào)用自身函數(shù),有一下兩種方式

通過使用自身函數(shù)名實現(xiàn)

通過使用arguments對象的callee屬性來實現(xiàn)

/*//無線遞歸
function fun() {
    console.log("23")
    fun()//調(diào)用自身函數(shù),實現(xiàn)遞歸
}
fun()*/

function fn(v) {
    console.log(v);
    if (v>=5){
        return
    }
    /*fn(v+1)*///使用該方法終止遞歸當(dāng)執(zhí)行下列代碼輸出時,報錯
    arguments.callee(v+1)
}
/*fn(0)*/
var f = fn;
fn=null;
f(0);
特殊函數(shù) 匿名函數(shù)

在JavaScript中,當(dāng)把函數(shù)當(dāng)做數(shù)據(jù)使用時,可以不設(shè)置名字。匿名函數(shù)的兩種用法

可以將匿名函數(shù)作為參數(shù)傳給其他函數(shù)。

可以定一某個匿名函數(shù)執(zhí)行某些一次性任務(wù)。

回調(diào)函數(shù)

當(dāng)一個函數(shù)作為另一個函數(shù)的參數(shù)時,作為參數(shù)的函數(shù)被稱之為回調(diào)函數(shù)。

//作為另一個函數(shù)參數(shù)的函數(shù)fun->回調(diào)函數(shù)
var fun = function () {
    return 2;
};

function fn(v) {
    return v();
}
/*
var result=fn(fun);//函數(shù)fun作為函數(shù)fn的實參
console.log(result);
*/

//以上代碼等同于以下代碼
//以下代碼中作為參數(shù)的函數(shù)->匿名回調(diào)函數(shù)

var f = fn(function(){return 2;});
console.log(f);
自調(diào)函數(shù)

自調(diào)函數(shù)就是在定義函數(shù)后自行調(diào)用

/*    自調(diào)函數(shù)->定義即調(diào)用的函數(shù)
*      相當(dāng)于在匿名函數(shù)外加了小括號
*      第一對括號->定義函數(shù)
*      第二對括號->調(diào)用函數(shù)*/

(function () {
    console.log("23")
})()//23->后邊的括號表示調(diào)用
作為值的函數(shù)

一個函數(shù)作為另一個函數(shù)的結(jié)果進(jìn)行返回,作為結(jié)果返回的函數(shù)稱之為作為值的函數(shù)

var one = function(){
    return 100;
}
// 作為值的函數(shù) -> 內(nèi)部函數(shù)的一種特殊用法
function fun(){
    var v = 100;
    // 內(nèi)部函數(shù)
    return function(){
        return v;
    };
}

var result = fun();
// console.log(result);// one函數(shù)
// console.log(result());// 100

console.log(fun()());
閉包 作用域鏈

作用域鏈就是指局部作用域可以訪問它的父級所能訪問的作用域

var a = 10;// 全局變量
function fun(){
    var b = 100;// fun函數(shù)作用域的局部變量
    // 內(nèi)部函數(shù)
    function fn(){
        var c = 200;// fn函數(shù)作用域的局部變量
        // 內(nèi)部函數(shù)
        function f(){
            var d = 300;// f函數(shù)作用域的布局變量
            // 調(diào)用變量
            console.log(a);// 10
            console.log(b);// 100
            console.log(c);// 200
            console.log(d);// 300
        }
        f();
        // 調(diào)用變量
        // console.log(a);// 10
        // console.log(b);// 100
        // console.log(c);// 200
        // console.log(d);// d is not defined
    }
    fn();
    // 調(diào)用變量
    // console.log(a);// 10
    // console.log(b);// 100
    // console.log(c);// c is not defined
    // console.log(d);// d is not defined
}
fun();
閉包

當(dāng)內(nèi)部任何一個函數(shù)被通過一種方式被任何一個外部作用域訪問時,就是一個閉包。

var n;// 定義變量,但不初始化值
function fun(){// 函數(shù)作用域
    var v = 100;
    // 進(jìn)行初始化值 -> 一個函數(shù)
    n = function(){
        console.log(v);
    }
    // n();
}
fun();

n();// 100

閉包的作用

提供可享的局部變量

保護(hù)共享的局部變量,提專門讀寫變量的函數(shù)

避免全局污染

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108242.html

相關(guān)文章

  • JavaScript設(shè)計模式與開發(fā)實踐 | 01 - 面向對象JavaScript

    摘要:在中,并沒有對抽象類和接口的支持。例如,當(dāng)對象需要對象的能力時,可以有選擇地把對象的構(gòu)造器的原型指向?qū)ο?,從而達(dá)到繼承的效果。本節(jié)內(nèi)容為設(shè)計模式與開發(fā)實踐第一章筆記。 動態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動態(tài)類型語言。 靜態(tài)類型語言在編譯時已確定變量類型,動態(tài)類型語言的變量類型要到程序運(yùn)行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...

    suxier 評論0 收藏0
  • 面向對象JavaScript(如何一步步成為js高手)

    摘要:雖然,也是面向疾苦的語言,但是,它和靜態(tài)類型語言的面向接口編程不一而足。對象對他自己的行為負(fù)責(zé),其他對象不關(guān)心它的內(nèi)部實現(xiàn)。 ‘工欲善其事,必先利其器’,在深入學(xué)習(xí)JavaScript之前,我認(rèn)為我們很有必要了解以下,JavaScript這門面向?qū)ο蟮膭討B(tài)語言到底是一門什么樣的語言。 JavaScript vs 其他面向?qū)ο笳Z言 它沒有使用像Java等傳統(tǒng)的面向?qū)ο笳Z言的類式繼承,而...

    peixn 評論0 收藏0
  • 理清javascript中的面向對象(一)——原型繼承

    摘要:有一函數(shù)若是用來生成對象,則稱為構(gòu)造函數(shù)名。屬性指定了使用該構(gòu)造函數(shù)生成的對象實例繼承了哪個對象實例。因此,只要利用,就能在構(gòu)造函數(shù)中,為未來利用此構(gòu)造函數(shù)生成的對象實例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向?qū)ο蟛⒎且蕾囉诔橄蟮念?,而是通過原型鏈,將一個個具體的對象實例進(jìn)行連接,位于原型鏈下游的對象實例可以讀取/使用位于上游的對象實例的屬性/...

    beita 評論0 收藏0
  • 淺談JavaScript面向對象

    摘要:不必在構(gòu)造函數(shù)中定義對象實例的信息。其次,按照一切事物皆對象的這餓極本的面向?qū)ο蟮姆▌t來說,類本身并不是一個對象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個對象。第二個問題就是在創(chuàng)建子類型的實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計中各出沒。寫這篇文章,主要參考與JavaScrip...

    cyixlq 評論0 收藏0
  • 更好理解的面向對象Javascript 1 —— 動態(tài)類型和多態(tài)

    摘要:動態(tài)類型語言和鴨子類型編程語言按照數(shù)據(jù)類型大體可分為靜態(tài)類型語言和動態(tài)類型語言。鴨子類型的概念至關(guān)重要,比如一個對象有了屬性,也可以依照下標(biāo)來存取屬性,這個對象就可以被當(dāng)做數(shù)組來使用。 前言 曾經(jīng)對Javascript的面向?qū)ο笙嚓P(guān)知識也有過了解,從各種博客、書籍上也學(xué)到了很多。但是最近在看《Javascript設(shè)計模式與開發(fā)實戰(zhàn)》這本書時發(fā)現(xiàn)該書對這方面的知識點介紹的很易于理解,因此...

    shusen 評論0 收藏0
  • JavaScript面向對象的程序設(shè)計

    摘要:目錄導(dǎo)語理解對象和面向?qū)ο蟮某绦蛟O(shè)計創(chuàng)建對象的方式的繼承機(jī)制原型對象原型鏈與原型對象相關(guān)的方法小結(jié)導(dǎo)語前面的系列文章,基本把的核心知識點的基本語法標(biāo)準(zhǔn)庫等章節(jié)講解完本章開始進(jìn)入核心知識點的高級部分面向?qū)ο蟮某绦蛟O(shè)計,這一部分的內(nèi)容將會對對象 目錄 導(dǎo)語 1.理解對象和面向?qū)ο蟮某绦蛟O(shè)計 2.創(chuàng)建對象的方式 3.JavaScript的繼承機(jī)制 3.1 原型對象 3.2 原型鏈 3.3 與...

    gitmilk 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<