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

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript中的Function類(lèi)型

derek_334892 / 2788人閱讀

摘要:結(jié)果為結(jié)果為不過(guò),提供了對(duì)象,該對(duì)象可以模擬函數(shù)重載的現(xiàn)象。默認(rèn)名字的函數(shù)被稱(chēng)之為匿名函數(shù)。提供專(zhuān)門(mén)的讀寫(xiě)變量的函數(shù)避免全局污染閉包的應(yīng)用利用閉包保護(hù)共享的局部變量,提供專(zhuān)門(mén)的讀寫(xiě)變量的函數(shù)

Function與函數(shù)

函數(shù)是一段JavaScript代碼,它只定義一次,但可能被執(zhí)行或調(diào)用多次
Function類(lèi)型是JavaScript提供的引用類(lèi)型之一,通過(guò)Function類(lèi)型創(chuàng)建Function對(duì)象
在JavaScript中,函數(shù)也是以對(duì)象的形式存在的。每個(gè)函數(shù)都是一個(gè)Function對(duì)象
函數(shù)名,本質(zhì)就是一個(gè)變量名,是指向某個(gè)Function對(duì)象的引用

function fn(){
    console.log("前端");
}
console.log(fn instanceof Function);//true
構(gòu)造函數(shù)

在JavaScript中,函數(shù)除了可以通過(guò)函數(shù)定義語(yǔ)句或字面量表達(dá)式兩種方式定義之外,還可以通過(guò)Function類(lèi)型進(jìn)行定義

var fn=new Function("num1","num2","var sum = num1+num2;return sum");

通過(guò)Function類(lèi)型定義函數(shù)的效率遠(yuǎn)不如通過(guò)函數(shù)定義語(yǔ)句或字面量表達(dá)式兩種方式定義
目前,定義函數(shù)具有三種方式,這三種方式之間存在一定差別
函數(shù)定義語(yǔ)句:函數(shù)名被聲明提前,不存在效率問(wèn)題
字面量表達(dá)式:函數(shù)體固定,無(wú)法動(dòng)態(tài)執(zhí)行,不存在效率問(wèn)題
Function類(lèi)型定義:函數(shù)體是字符串,可以動(dòng)態(tài)執(zhí)行,效率低

Function的apply()方法

Function的apply()方法用于調(diào)用一個(gè)函數(shù),并且接收指定的this值,以及一個(gè)數(shù)組作為參數(shù),其語(yǔ)法結(jié)構(gòu)如下:

func.apply(thisArg,[argsArray])

thisArg參數(shù):可選項(xiàng),在func函數(shù)運(yùn)行時(shí)使用的this值

argsArray參數(shù):可選項(xiàng),一個(gè)數(shù)組或者類(lèi)數(shù)組對(duì)象,其中的數(shù)組元素將作為多帶帶的參數(shù)傳給func函數(shù)。也可以使用arguments對(duì)象作為該參數(shù)

返回值:調(diào)用該函數(shù)的返回結(jié)果

var numbers=[1,2,3,4,5];
//通過(guò)apply()方法獲取數(shù)組中最大值和最小值
var max=Math.max.apply(null,numbers);
var min=Math.min.apply(null,numbers);
Function的call()方法

Function的call()方法用于調(diào)用一個(gè)函數(shù),并且接收指定的this值作為參數(shù),以及參數(shù)列表。其語(yǔ)法結(jié)構(gòu)如下:

func.call(thisArg,arg1,arg2,...)

thisArg參數(shù):在func函數(shù)運(yùn)行時(shí)使用的this值

arg1,arg2,...參數(shù):指定的參數(shù)列表

返回值:調(diào)用該函數(shù)的返回結(jié)果

apply()與call()非常相似,不同之處在于提供參數(shù)的方式

//通過(guò)call()方法獲取數(shù)組中最大值和最小值
var max=Math.max.call(null,5,6,2,3,7);
var min=Math.min.call(null,5,6,2,3,7);
Function的bind()方法

Function的bind()方法用于創(chuàng)建一個(gè)新的函數(shù)(稱(chēng)為綁定函數(shù)),并且接收指定的this值作為參數(shù),以及參數(shù)列表,其語(yǔ)法結(jié)構(gòu)如下:

fun.bind(thisArg[,arg1[,arg2[,...]]])

thisArg參數(shù):當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的this指向

arg1,arg2,...參數(shù):當(dāng)綁定函數(shù)被調(diào)用時(shí),這些參數(shù)將置于實(shí)參之前傳遞給被綁定的方法

返回值:返回由指定的this值和初始化參數(shù)改造的原函數(shù)

Function的bind()方法示例如下:

this.x=9;
var module={
    x:81,
    getX:function(){return this.x;}
};

module.getX();//返回81

var retrieveX=module.getX;
retrieveX();//返回9,在這種情況下,"this"指向全局作用域

//創(chuàng)建一個(gè)新函數(shù),將"this"綁定到module對(duì)象
var boundGetX=retrieveX.bind(module);
boundGetX();//返回 81
沒(méi)有重載

在其他開(kāi)發(fā)語(yǔ)言中,函數(shù)具有一種特性,叫做重載。所謂重載,就是定義多個(gè)同名的函數(shù),但每一個(gè)函數(shù)接收的參數(shù)的個(gè)數(shù)不同,程序會(huì)根據(jù)調(diào)用時(shí)傳遞的實(shí)參個(gè)數(shù)進(jìn)行判斷,具體調(diào)用的是哪個(gè)函數(shù)。如下示例:

function add(a,b){
    return a+b;
}
function add(a,b,c){
    return a+b+c;
}
add(1,2);//結(jié)果為3
add(1,2,3);//結(jié)果為6

但在JavaScript中,函數(shù)是沒(méi)有重載現(xiàn)象的,也就是說(shuō),如果同時(shí)定義多個(gè)同名的函數(shù),只有最后一個(gè)定義的函數(shù)是有效的。

function add(a,b){
    return a+b;
}
function add(a,b,c){
    return a+b+c;
}
add(1,2);//結(jié)果為NaN
add(1,2,3);//結(jié)果為6 

不過(guò),JavaScript提供了arguments對(duì)象,該對(duì)象可以模擬函數(shù)重載的現(xiàn)象。arguments對(duì)象是函數(shù)內(nèi)部的本地變量;arguments已經(jīng)不再是函數(shù)的屬性了。
arguments對(duì)象可以獲取函數(shù)的所有參數(shù),但arguments對(duì)象并不是一個(gè)數(shù)組,而是一個(gè)類(lèi)數(shù)組對(duì)象(沒(méi)有數(shù)組特有的方法)
arguments對(duì)象的屬性如下所示:
callee:表示當(dāng)前執(zhí)行的函數(shù)
length:表示傳遞給當(dāng)前函數(shù)的參數(shù)數(shù)量
利用arguments對(duì)象實(shí)現(xiàn)模擬函數(shù)的重載現(xiàn)象,如下述示例

function doAdd(){
    if(arguments.length==1){
        console.log(arguments[0]+5);
    }else if(arguments.length==2){
        console.log(arguments[0]+arguments[1]);
    }
}

doAdd(10);//輸出"15"
doAdd(40,20);//輸出"60"
遞歸

在一個(gè)函數(shù)的函數(shù)體內(nèi),如果想調(diào)用自身函數(shù)的話,有如下兩種方式:

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

通過(guò)使用arguments對(duì)象的callee屬性實(shí)現(xiàn)

調(diào)用自身的函數(shù)被稱(chēng)之為遞歸函數(shù),在某種意義上說(shuō),遞歸近似于循環(huán)。兩者都重復(fù)執(zhí)行相同的代碼,并且兩者都需要一個(gè)終止條件以避免無(wú)限循環(huán)或者無(wú)限遞歸。

function loop(x){
    if(x>=10){return;}
    loop(x+1);
}
loop(0);

上述代碼是一個(gè)經(jīng)典的遞歸函數(shù)。雖然這個(gè)函數(shù)表面看起來(lái)并沒(méi)有什么問(wèn)題,如果執(zhí)行下述代碼可能會(huì)導(dǎo)致出錯(cuò)。

var anotherLoop=loop;
loop=null;
anotherLoop(0);//出錯(cuò)

上述代碼將函數(shù)loop()保存到另一個(gè)變量anotherLoop中,然后將loop設(shè)置為null值。當(dāng)執(zhí)行anotherLoop時(shí),一定會(huì)執(zhí)行函數(shù)loop(),而loop已經(jīng)不再是一個(gè)函數(shù),最終導(dǎo)致出錯(cuò)
要想解決上述遞歸函數(shù)的問(wèn)題,可以使用arguments對(duì)象的callee屬性替換具體的函數(shù)名

function loop(x){
    if(x>=10){
        return;
    }
    arguments.callee(x+1);
}
匿名函數(shù)

JavaScript可以將函數(shù)作為數(shù)據(jù)使用,作為函數(shù)本體,它像普通的數(shù)據(jù)一樣,不一定要有名字。默認(rèn)名字的函數(shù)被稱(chēng)之為匿名函數(shù)。如下示例:

function(a){return a}

匿名函數(shù)的兩種方法:

可以將匿名函數(shù)作為參數(shù)傳遞給其他函數(shù)。這樣,接收方函數(shù)就能利用所傳遞的函數(shù)來(lái)完成某些事情

可以定義某個(gè)匿名函數(shù)來(lái)執(zhí)行某些一次性任務(wù)

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

當(dāng)一個(gè)函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)時(shí),作為參數(shù)的函數(shù)被稱(chēng)之為回調(diào)函數(shù)

function add(a,b){
    return a()+b();
}

var one=function(){return 1;}
var two=function(){return 2;}

console.log(add(one,two));//output 3
//可以直接使用匿名函數(shù)來(lái)替代one()和two(),以作為目標(biāo)函數(shù)的參數(shù)
console.log(add(function(){return 1;},function(){return 2;}));

上述代碼中,函數(shù)one()和two()都作為函數(shù)add()的參數(shù)傳遞。所以函數(shù)one()和two()都是回調(diào)函數(shù)。當(dāng)將函數(shù)A傳遞給函數(shù)B,并由B來(lái)執(zhí)行A時(shí),A就成了一個(gè)回調(diào)函數(shù),如果A還是一個(gè)無(wú)名函數(shù),就稱(chēng)之為匿名回調(diào)函數(shù)
回調(diào)函數(shù)優(yōu)點(diǎn)如下:

它可以在不做命名的情況下傳遞函數(shù)(這意味著可以節(jié)省全局變量)

可以將一個(gè)函數(shù)調(diào)用操作委托給另一個(gè)函數(shù)(這意味著可以節(jié)省一些代碼編寫(xiě)工作)

回調(diào)函數(shù)也有助于提升性能

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

所謂自調(diào)函數(shù)就是在定義函數(shù)后自行調(diào)用。如下示例:

(function(){
    console.log("javascript");
})();

上述代碼的含義如下:

第一對(duì)括號(hào)的作用,放置的是一個(gè)匿名函數(shù)。

第二對(duì)括號(hào)的作用,是"立即調(diào)用"

自調(diào)函數(shù)只需將匿名函數(shù)的定義放進(jìn)一對(duì)括號(hào)中,然后外面再跟一對(duì)括號(hào)即可
自調(diào)函數(shù)也可以在調(diào)用時(shí)接收參數(shù),如下示例:

(function(name){
    console.log("hello"+name+"!");
})("javascript");//hello javascript

上述代碼的含義如下:

第一個(gè)括號(hào)中的匿名函數(shù)接受一個(gè)參數(shù)

第二個(gè)括號(hào),在調(diào)用時(shí),向匿名函數(shù)傳遞參數(shù)內(nèi)容

作為值的函數(shù)

將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果進(jìn)行返回,作為結(jié)果返回的函數(shù)稱(chēng)之為作為值得函數(shù)

function fn(f,args){
    return f(args);
}
function add(num){//作為值的函數(shù)
    return num+10;
}

var result=fn(add,10);
console.log(result);//20

上述代碼還可以編寫(xiě)成如下方式:

function fn(args){
    return function add(){
        return args+10;
    }
}

上述兩段代碼的區(qū)別在于

var f=fn(10);//function add(){return 10+10}
var result=f();//20
作用域鏈

很多開(kāi)發(fā)語(yǔ)言中都具有塊級(jí)作用域,但ECMAScript5版本中并沒(méi)有跨級(jí)作用域,這經(jīng)常會(huì)導(dǎo)致理解上的困惑。如下示例:

if(true){
    var color="blue";
}
console.log(color);//blue

上述代碼在if語(yǔ)句中定義了變量color。但該變量的作用域是全局域,原因是ECMAScript5版本中沒(méi)有塊級(jí)作用域
雖然ECMAScript5版本沒(méi)有塊級(jí)作用域,但具有函數(shù)作用域。在某個(gè)函數(shù)內(nèi)部定義的變量的作用域就是該函數(shù)作用域。

function fun(){
    var v="this is function";
}
console.log(v);//輸出報(bào)錯(cuò)

上述代碼在函數(shù)fun內(nèi)部定義了變量v,該變量的作用域是fun函數(shù)作用域。所以在全局域訪問(wèn)該變量時(shí)會(huì)出錯(cuò)
每一段JavaScript(全局代碼或函數(shù))都有一個(gè)與之關(guān)聯(lián)的作用域鏈。這個(gè)作用域鏈?zhǔn)且粋€(gè)對(duì)象列表或鏈表,這組對(duì)象定義了這段代碼"作用域中"的變量。如下示例:

var a=1;
//在全局域中只能訪問(wèn)變量a
function f(){
    //在f函數(shù)作用域中可以訪問(wèn)變量a和b
    var b=2;
}
閉包

JavaScript允許函數(shù)嵌套,并且內(nèi)部函數(shù)可以訪問(wèn)定義在外部函數(shù)中的所有變量和函數(shù),以及外部函數(shù)能訪問(wèn)的所有變量和函數(shù)。但是,外部函數(shù)卻不能夠訪問(wèn)定義在內(nèi)部函數(shù)中的變量和函數(shù)。
當(dāng)內(nèi)部函數(shù)以某一種方式被任何一個(gè)外部函數(shù)作用域訪問(wèn)時(shí),一個(gè)閉包就產(chǎn)生了
閉包就是該函數(shù)能使用函數(shù)外定義的變量
如下代碼就是一個(gè)最簡(jiǎn)單形式的閉包結(jié)構(gòu):

var b;
function f(){
    var a="a";
    b=function(){
        return a+"b";
    }
    return a;
}
//測(cè)試
console.log(f());//a
console.log(b());//ab

閉包的特點(diǎn)與作用
閉包的特點(diǎn):

局部變量:在函數(shù)中定義有共享意義(如:緩存、計(jì)數(shù)器等)的局部變量。(注意:定義成全局變量會(huì)對(duì)外造成污染)

內(nèi)部函數(shù):在函數(shù)(f)中聲明有內(nèi)嵌函數(shù),內(nèi)嵌函數(shù)(g)對(duì)函數(shù)(f)中的局部變量進(jìn)行訪問(wèn)

外部使用:函數(shù)(f)向外返回此內(nèi)嵌函數(shù)(g),外部可以通過(guò)此內(nèi)嵌函數(shù)持有并訪問(wèn)聲明在函數(shù)(f)中的局部變量,而此變量在外部是通過(guò)其他途徑無(wú)法訪問(wèn)的

閉包的作用

提供可共享的局部變量

保護(hù)共享的局部變量。提供專(zhuān)門(mén)的讀寫(xiě)變量的函數(shù)

避免全局污染

閉包的應(yīng)用
利用閉包保護(hù)共享的局部變量,提供專(zhuān)門(mén)的讀寫(xiě)變量的函數(shù)

var getValue,setValue;
(function(){
    var secret=0;
    getValue=function(){
        return secret;
    };
    setValue=function(v){
        secret=v;
    }
})();

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

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

相關(guān)文章

  • JavaScript 面向?qū)ο箝_(kāi)發(fā)知識(shí)總結(jié)基礎(chǔ)篇

    摘要:字面形式允許你在不需要使用操作符和構(gòu)造函數(shù)顯式創(chuàng)建對(duì)象的情況下生成引用值。操作符以一個(gè)對(duì)象和一個(gè)構(gòu)造函數(shù)作為參數(shù)鑒別數(shù)組有前一小結(jié)可以知道鑒別數(shù)組類(lèi)型可以使用。屬性是函數(shù)獨(dú)有的,表明該對(duì)象可以被執(zhí)行。這種函數(shù)被稱(chēng)為匿名函數(shù)。 引子: 1.JavaScript 中的變量類(lèi)型和類(lèi)型檢測(cè) 1.1原始類(lèi)型 1.2引用類(lèi)型 1.3內(nèi)建類(lèi)型的實(shí)例化 1.4函數(shù)的字面形式 1.5正則表達(dá)式的字...

    Kross 評(píng)論0 收藏0
  • JavaScript中的數(shù)據(jù)類(lèi)型及其檢測(cè)

    摘要:中的數(shù)據(jù)類(lèi)型及其檢測(cè)數(shù)據(jù)類(lèi)型基本類(lèi)型引用類(lèi)型類(lèi)型檢測(cè)只能檢測(cè)基本數(shù)據(jù)類(lèi)型,對(duì)于還有一個(gè)用于檢測(cè)某個(gè)對(duì)象的原型鏈?zhǔn)欠癜硞€(gè)構(gòu)造函數(shù)的屬性適用于檢測(cè)對(duì)象,它是基于原型鏈運(yùn)作的屬性返回一個(gè)指向創(chuàng)建了該對(duì)象原型的函數(shù)引用,該屬性的值是哪個(gè)函數(shù)本身 JavaScript中的數(shù)據(jù)類(lèi)型及其檢測(cè) 1. 數(shù)據(jù)類(lèi)型 1.1 基本類(lèi)型 Number String Boolean Null Undefin...

    Bryan 評(píng)論0 收藏0
  • JavaScript面向?qū)ο?em>中的Function類(lèi)型個(gè)人分享

    摘要:類(lèi)型與函數(shù)的概念函數(shù)這樣的一段代碼它只定義一次但是可能被執(zhí)行或調(diào)用多次類(lèi)型是提供的引用類(lèi)型之一通過(guò)類(lèi)型創(chuàng)建對(duì)象在中函數(shù)也是對(duì)象的形式存在注意每個(gè)函數(shù)都是以個(gè)對(duì)象與函數(shù)函數(shù)聲明方式示例代碼一笑一人生字面量方式示例代碼一花一世界判斷函數(shù)是否為類(lèi) Function類(lèi)型 Function與函數(shù)的概念 函數(shù)這樣的一段JavaScript代碼,它只定義一次,但是可能被執(zhí)行或調(diào)用多次 Functi...

    LeviDing 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)知識(shí)

    摘要:用和包裹的內(nèi)容,稱(chēng)為字符串。關(guān)系運(yùn)算符用于進(jìn)行比較的運(yùn)算符。強(qiáng)制依賴(lài)于,非強(qiáng)制依賴(lài)于。使用場(chǎng)合全局環(huán)境構(gòu)造函數(shù)對(duì)象的方法閉包閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。所有全局對(duì)象函數(shù)以及變量均自動(dòng)成為對(duì)象的成員。 1 什么是JavaScript JavaScript一種直譯式腳本語(yǔ)言,一種基于對(duì)象和事件驅(qū)動(dòng)并具有安全性的客戶端腳本語(yǔ)言;也是一種廣泛應(yīng)用客戶端web開(kāi)發(fā)的腳本語(yǔ)言。...

    Code4App 評(píng)論0 收藏0
  • 前端基礎(chǔ)入門(mén)四(JavaScript基礎(chǔ))

    摘要:學(xué)習(xí)目標(biāo)掌握編程的基本思維掌握編程的基本語(yǔ)法我們先來(lái)學(xué)習(xí)基礎(chǔ),后續(xù)會(huì)講解高級(jí)。語(yǔ)句基本語(yǔ)法當(dāng)循環(huán)條件為時(shí),執(zhí)行循環(huán)體,當(dāng)循環(huán)條件為時(shí),結(jié)束循環(huán)?;A(chǔ)語(yǔ)法循環(huán)體循環(huán)條件代碼示例初始化變量循環(huán)體自增循環(huán)條件語(yǔ)句和一般用來(lái)解決無(wú)法確認(rèn)次數(shù)的循環(huán)。 學(xué)習(xí)目標(biāo): 掌握編程的基本思維 掌握編程的基本語(yǔ)法 我們先來(lái)學(xué)習(xí)JavaScript基礎(chǔ),后續(xù)會(huì)講解JavaScript高級(jí)。 重點(diǎn)內(nèi)容 變...

    王軍 評(píng)論0 收藏0
  • 前端基礎(chǔ)入門(mén)四(JavaScript基礎(chǔ))

    摘要:學(xué)習(xí)目標(biāo)掌握編程的基本思維掌握編程的基本語(yǔ)法我們先來(lái)學(xué)習(xí)基礎(chǔ),后續(xù)會(huì)講解高級(jí)。語(yǔ)句基本語(yǔ)法當(dāng)循環(huán)條件為時(shí),執(zhí)行循環(huán)體,當(dāng)循環(huán)條件為時(shí),結(jié)束循環(huán)。基礎(chǔ)語(yǔ)法循環(huán)體循環(huán)條件代碼示例初始化變量循環(huán)體自增循環(huán)條件語(yǔ)句和一般用來(lái)解決無(wú)法確認(rèn)次數(shù)的循環(huán)。 學(xué)習(xí)目標(biāo): 掌握編程的基本思維 掌握編程的基本語(yǔ)法 我們先來(lái)學(xué)習(xí)JavaScript基礎(chǔ),后續(xù)會(huì)講解JavaScript高級(jí)。 重點(diǎn)內(nèi)容 變...

    SnaiLiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<