成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript中的Function類型

derek_334892 / 2826人閱讀

摘要:結果為結果為不過,提供了對象,該對象可以模擬函數(shù)重載的現(xiàn)象。默認名字的函數(shù)被稱之為匿名函數(shù)。提供專門的讀寫變量的函數(shù)避免全局污染閉包的應用利用閉包保護共享的局部變量,提供專門的讀寫變量的函數(shù)

Function與函數(shù)

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

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

在JavaScript中,函數(shù)除了可以通過函數(shù)定義語句或字面量表達式兩種方式定義之外,還可以通過Function類型進行定義

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

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

Function的apply()方法

Function的apply()方法用于調用一個函數(shù),并且接收指定的this值,以及一個數(shù)組作為參數(shù),其語法結構如下:

func.apply(thisArg,[argsArray])

thisArg參數(shù):可選項,在func函數(shù)運行時使用的this值

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

返回值:調用該函數(shù)的返回結果

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

Function的call()方法用于調用一個函數(shù),并且接收指定的this值作為參數(shù),以及參數(shù)列表。其語法結構如下:

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

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

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

返回值:調用該函數(shù)的返回結果

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

//通過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)建一個新的函數(shù)(稱為綁定函數(shù)),并且接收指定的this值作為參數(shù),以及參數(shù)列表,其語法結構如下:

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

thisArg參數(shù):當綁定函數(shù)被調用時,該參數(shù)會作為原函數(shù)運行時的this指向

arg1,arg2,...參數(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)建一個新函數(shù),將"this"綁定到module對象
var boundGetX=retrieveX.bind(module);
boundGetX();//返回 81
沒有重載

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

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

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

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

不過,JavaScript提供了arguments對象,該對象可以模擬函數(shù)重載的現(xiàn)象。arguments對象是函數(shù)內部的本地變量;arguments已經(jīng)不再是函數(shù)的屬性了。
arguments對象可以獲取函數(shù)的所有參數(shù),但arguments對象并不是一個數(shù)組,而是一個類數(shù)組對象(沒有數(shù)組特有的方法)
arguments對象的屬性如下所示:
callee:表示當前執(zhí)行的函數(shù)
length:表示傳遞給當前函數(shù)的參數(shù)數(shù)量
利用arguments對象實現(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"
遞歸

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

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

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

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

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

上述代碼是一個經(jīng)典的遞歸函數(shù)。雖然這個函數(shù)表面看起來并沒有什么問題,如果執(zhí)行下述代碼可能會導致出錯。

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

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

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

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

function(a){return a}

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

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

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

回調函數(shù)

當一個函數(shù)作為參數(shù)傳遞給另一個函數(shù)時,作為參數(shù)的函數(shù)被稱之為回調函數(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ù)來替代one()和two(),以作為目標函數(shù)的參數(shù)
console.log(add(function(){return 1;},function(){return 2;}));

上述代碼中,函數(shù)one()和two()都作為函數(shù)add()的參數(shù)傳遞。所以函數(shù)one()和two()都是回調函數(shù)。當將函數(shù)A傳遞給函數(shù)B,并由B來執(zhí)行A時,A就成了一個回調函數(shù),如果A還是一個無名函數(shù),就稱之為匿名回調函數(shù)
回調函數(shù)優(yōu)點如下:

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

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

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

自調函數(shù)

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

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

上述代碼的含義如下:

第一對括號的作用,放置的是一個匿名函數(shù)。

第二對括號的作用,是"立即調用"

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

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

上述代碼的含義如下:

第一個括號中的匿名函數(shù)接受一個參數(shù)

第二個括號,在調用時,向匿名函數(shù)傳遞參數(shù)內容

作為值的函數(shù)

將一個函數(shù)作為另一個函數(shù)的結果進行返回,作為結果返回的函數(shù)稱之為作為值得函數(shù)

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

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

上述代碼還可以編寫成如下方式:

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

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

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

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

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

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

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

上述代碼在函數(shù)fun內部定義了變量v,該變量的作用域是fun函數(shù)作用域。所以在全局域訪問該變量時會出錯
每一段JavaScript(全局代碼或函數(shù))都有一個與之關聯(lián)的作用域鏈。這個作用域鏈是一個對象列表或鏈表,這組對象定義了這段代碼"作用域中"的變量。如下示例:

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

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

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

閉包的特點與作用
閉包的特點:

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

內部函數(shù):在函數(shù)(f)中聲明有內嵌函數(shù),內嵌函數(shù)(g)對函數(shù)(f)中的局部變量進行訪問

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

閉包的作用

提供可共享的局部變量

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

避免全局污染

閉包的應用
利用閉包保護共享的局部變量,提供專門的讀寫變量的函數(shù)

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

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

轉載請注明本文地址:http://m.hztianpu.com/yun/108202.html

相關文章

  • JavaScript 面向對象開發(fā)知識總結基礎篇

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

    Kross 評論0 收藏0
  • JavaScript中的數(shù)據(jù)類型及其檢測

    摘要:中的數(shù)據(jù)類型及其檢測數(shù)據(jù)類型基本類型引用類型類型檢測只能檢測基本數(shù)據(jù)類型,對于還有一個用于檢測某個對象的原型鏈是否包含某個構造函數(shù)的屬性適用于檢測對象,它是基于原型鏈運作的屬性返回一個指向創(chuàng)建了該對象原型的函數(shù)引用,該屬性的值是哪個函數(shù)本身 JavaScript中的數(shù)據(jù)類型及其檢測 1. 數(shù)據(jù)類型 1.1 基本類型 Number String Boolean Null Undefin...

    Bryan 評論0 收藏0
  • JavaScript面向對象中的Function類型個人分享

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

    LeviDing 評論0 收藏0
  • JavaScript基礎知識

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

    Code4App 評論0 收藏0
  • 前端基礎入門四(JavaScript基礎)

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

    王軍 評論0 收藏0
  • 前端基礎入門四(JavaScript基礎)

    摘要:學習目標掌握編程的基本思維掌握編程的基本語法我們先來學習基礎,后續(xù)會講解高級。語句基本語法當循環(huán)條件為時,執(zhí)行循環(huán)體,當循環(huán)條件為時,結束循環(huán)。基礎語法循環(huán)體循環(huán)條件代碼示例初始化變量循環(huán)體自增循環(huán)條件語句和一般用來解決無法確認次數(shù)的循環(huán)。 學習目標: 掌握編程的基本思維 掌握編程的基本語法 我們先來學習JavaScript基礎,后續(xù)會講解JavaScript高級。 重點內容 變...

    SnaiLiu 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<