摘要:類型是提供的引用類型之一,通過可需變更創(chuàng)建對(duì)象。調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。想要解決上述遞歸函數(shù)的問題,可以使用對(duì)象屬性替換具體的函數(shù)名。保護(hù)貢獻(xiàn)的局部變量。
Function類型 概述
Function與函數(shù)
函數(shù)是這樣的一段JavaScript代碼,她只定義一次,但是可能被執(zhí)行或調(diào)用多次。
Function類型是JavaScript提供的引用類型之一,通過Function可u需變更創(chuàng)建對(duì)象。
在JavaScript中,函數(shù)也是以對(duì)象形式存在的。每一個(gè)函數(shù)都是一個(gè)Function對(duì)象。函數(shù)名,本質(zhì)就是一個(gè)變量,是指向某個(gè)Function對(duì)象的引用。
function fn(){
console.log(‘臥龍學(xué)院’);
}
console.log (fn instanceof Function);//true
構(gòu)造函數(shù)
在JavaScript中,函數(shù)除了可以通過函數(shù)定義語句或字面量變大時(shí)兩個(gè)方式意外,還可以通過Function類型進(jìn)行定義:
var add = new Function(
"num1".
"num2",
)
注意:通過Function類型定義函數(shù)的效率遠(yuǎn)不如通過函數(shù)定義或者字面量定義表達(dá)式兩個(gè)方式定義,目前,定義函數(shù)具有三種表達(dá)式。
Function的apply()方法
Function的apply()方法用于調(diào)用一個(gè)函數(shù),并且接受指定的this值,以及一個(gè)數(shù)組作為參數(shù)。其語法如下結(jié)構(gòu):
func.apply(thisarg,[argsarray])
this參數(shù):可選項(xiàng),在func函數(shù)運(yùn)行時(shí)使用的this值。
argsarray參數(shù):可選項(xiàng),一個(gè)數(shù)組或者類數(shù)組對(duì)象,其中的數(shù)組元素將作為多帶帶的參數(shù)傳給func函數(shù)。也可以使用argumengts對(duì)象作為該參數(shù)。
返回值調(diào)用該函數(shù)的返回結(jié)果。
Function的call()方法
Function的call()方法用于調(diào)用一個(gè)函數(shù),并且接受指定的this值作為參數(shù),以及參數(shù)列表。
thisarg參數(shù):在func函數(shù)運(yùn)行時(shí)使用的this值。arg1 arg2 參數(shù):指定參數(shù)列表
返回值:調(diào)用該函數(shù)的返回結(jié)果。
apply()于call()非常相似,不同之處在于提供參數(shù)的方法
Functiond 的bind()方法
Function的bind()方法用于創(chuàng)建一個(gè)新的函數(shù)(稱之為綁定函數(shù)),并且接受指定的this值作為參數(shù),以及參數(shù)列表。其語法結(jié)果如下:
fun。bind(thisarg[[arg[,arg[,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è)置于實(shí)參之前傳遞給被綁定的方法。
返回值:返回又指定的this值和初始化參數(shù)改造的原函數(shù)拷貝。
沒有重載
在其他開發(fā)語言中,函數(shù)具有一種特性,叫做重載。所謂重載,就是定義多個(gè)同名函數(shù),但每一個(gè)函數(shù)接受的參數(shù)的個(gè)數(shù)不同,程序會(huì)根據(jù)調(diào)用實(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);//3
add(1,2,3);//6
但是在JavaScript中,函數(shù)是沒有重載現(xiàn)象的。也就是說,如果用是定義多個(gè)同名的函數(shù),只有最后一個(gè)定義的函數(shù)是有效的。
不過,JavaScript提供了arguments對(duì)象,該對(duì)象可以模型函數(shù)重載的現(xiàn)象。arguments對(duì)象時(shí)函數(shù)內(nèi)部的本地變量;argumengts以及不再時(shí)函數(shù)的屬性了。argumengts對(duì)象可以獲取函數(shù)的所有參數(shù),但argumengts對(duì)象并不是一個(gè)數(shù)組,而是一個(gè)類數(shù)組對(duì)象
遞歸
在一個(gè)函數(shù)的函數(shù)體內(nèi),如果想調(diào)用自身函數(shù)的話,有如下兩種方式:
通過使用自身函數(shù)名實(shí)現(xiàn)。
通過使用arguments對(duì)象的callee屬性實(shí)現(xiàn)。
調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。在某種意義上說,遞歸近似于循環(huán)。兩者都重復(fù)執(zhí)行相同的代碼,并且兩者都需要一個(gè)終止條件以避免無限循環(huán)或者無限遞歸。
function loop(x){
if(x>=10){ return;}
loop(x+1);
}
loop(0);
上述代碼是一個(gè)經(jīng)典的遞歸函數(shù)。雖然這個(gè)函數(shù)表面看起來并沒有什么問題,如果直線下述代碼可能會(huì)導(dǎo)致出錯(cuò)。
car anotherloop = loop ;
loop = null ;
anotherLoop (0)// 出錯(cuò)
上述代碼將函數(shù)loop()保存到另一個(gè)變量anotherloop中,然后將loop設(shè)置為null值。當(dāng)執(zhí)行another loop時(shí),一定會(huì)執(zhí)行函數(shù)loop(),而loop已經(jīng)不再是一個(gè)函數(shù),最終導(dǎo)致出錯(cuò)。
想要解決上述遞歸函數(shù)的問題,可以使用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ù)被定之為匿名函數(shù)。如下實(shí)例:
function(a){return a;}
匿名函數(shù)的兩種使用方法:
可以將匿名函數(shù)作為函數(shù)作為參數(shù)傳遞給其他函數(shù)。這樣,接受方函授就能利用所傳遞的函數(shù)來完成某些事情。
可以定義某個(gè)匿名函數(shù)來執(zhí)行某些一次性任務(wù)。
回調(diào)函數(shù)
當(dāng)一個(gè)函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)時(shí),作為參數(shù)的函數(shù)被稱之為回調(diào)函數(shù)。
function add(a,breturn a ()+b()} var one = function () {return1;}
var two = function(){return 2;}
console.log (add(one,two));//output 3}
可以直接使用匿名函數(shù)來替代one()和two(),以作為目標(biāo)函數(shù)的參數(shù)
console。log (add(function(){return 1;}, function(return2;)))
上述代碼中。函數(shù)one()two()都作為函數(shù)add()的參數(shù)傳遞。所有one()和two()都是回調(diào)函數(shù)。當(dāng)將函數(shù)A傳遞給函數(shù)B,并由B來執(zhí)行A時(shí),A就成了一個(gè)回調(diào)函數(shù)。 如果A 還是一個(gè)無名函數(shù) 就稱之為匿名會(huì)點(diǎn)函數(shù)。 回調(diào)函數(shù)的優(yōu)點(diǎn)如下:
它可以在不做命名的情況下傳遞函數(shù)(這意味著可以節(jié)省全局變量)。
可以將一個(gè)函數(shù)調(diào)用操作委托給另一個(gè)函數(shù)()這意味著可以節(jié)省一些代碼編寫工作。
回調(diào)函數(shù)也有助于提升性能
自調(diào)函數(shù)
所謂自掉函數(shù)就是定義函數(shù)后自行調(diào)用。如下實(shí)例:
(function(){console.log("javascript");
})();
上述代碼的含義:第一對(duì) 括號(hào)的作用,放置的時(shí)一個(gè)匿名函數(shù)。
第二隊(duì)括號(hào)的作用,時(shí)’立即調(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+"!");
})(""jacasript);//hello javasript
上述代碼的含義如下:
當(dāng)一個(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ù)稱之為作為值的函數(shù)。
function fn( f,args){
return f (ars);
}
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ā)語言中都具有塊級(jí)作用域,但ECMAScript5版本中并沒有跨級(jí)作用域,這經(jīng)常會(huì)導(dǎo)致理解上的困惑。如下示例:
if (true){
var color= ‘blue’;
}
console。log(color);//blue
上述代碼再if語句中的定義了變量color。但該變量的作用域時(shí)全局域,原因是ECMASript5版本中沒有塊級(jí)作用域。
雖然再ECMASript5版本沒有塊級(jí)作用域。但具有函數(shù)作用域。在某個(gè)函數(shù)內(nèi)部定義的變量的作用域就是該函數(shù)的作用域。
function fun(){
var v = this is "wolongxueyuan ";
}
console .log (v)//輸出報(bào)錯(cuò)
上述代碼在函數(shù)fun內(nèi)部定義了變量v ,該變量的作用域是fun函數(shù)的作用域。 所以在全局域訪問該變量時(shí)會(huì)報(bào)錯(cuò)。每一段JavaScript代碼(全局代碼或函數(shù))都有一個(gè)與值關(guān)聯(lián)的作用域鏈。 這個(gè)作用或鏈?zhǔn)揭粋€(gè)對(duì)象列表或鏈表,這組對(duì)象定義了這段代碼作用域中的變量。
閉包是什么
JavaScript允許函數(shù)嵌套,并且內(nèi)部函數(shù)可以訪問定義在外部函數(shù)中的所有變量函數(shù),已經(jīng)外部函數(shù)能訪問的所有變量和函數(shù)。但是,外部函數(shù)作用域訪問時(shí),一個(gè)閉包就產(chǎn)生了。
閉包就是詞法表示包括不必計(jì)算的變量的函數(shù), 也就是說, 該函數(shù)能使用函數(shù)外定義的變量
如下述代碼就是一個(gè)最簡單形式的閉包結(jié)構(gòu):
var b ;
function f(){
var a=" a"};
b=function(){
returnn a+"b";
}
return a;
}
//測試
console.log (f());//a
console.log(b());//ab
閉包的特點(diǎn)
局部變量;在函數(shù)中定義有貢獻(xiàn)意義 的局部變量。()定義成全局變量會(huì)對(duì)外造成污染
內(nèi)部函數(shù):在函數(shù)(f)中聲明有內(nèi)嵌函數(shù),內(nèi)嵌函數(shù)(g)對(duì)函數(shù)(f)中的局部變量進(jìn)行訪問。
外部使用:函數(shù)(f)向外返回詞內(nèi)嵌函數(shù)(g),外部可以通過詞內(nèi)嵌函數(shù)持有并訪問聲明在函數(shù)(f) 中的局部變量,而此變量在外部時(shí)通過其他途徑無法訪問的。
閉包作用:
提供可共享的局部變量。
保護(hù)貢獻(xiàn)的局部變量。提供專門的讀寫變量的函數(shù)。
避免全局污染
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108265.html
摘要:給的實(shí)例注入一個(gè)的屬性,這也就是為什么我們?cè)诘慕M件中可以通過訪問到的各種數(shù)據(jù)和狀態(tài)源碼位置,是怎么實(shí)現(xiàn)的源碼位置是對(duì)的的初始化,它接受個(gè)參數(shù),為當(dāng)前實(shí)例,為的,為執(zhí)行的回調(diào)函數(shù),為當(dāng)前模塊的路徑。 20190221 請(qǐng)簡述一下vuex實(shí)現(xiàn)原理 對(duì)vuex基礎(chǔ)概念有不懂的可以點(diǎn)這里 vuex實(shí)現(xiàn)原理我們簡單過一遍源碼 地址 https://github.com/vuejs/vuex 首...
摘要:首先變量對(duì)于一個(gè)程序來說是一個(gè)很重要的角色那么問題來了這些變量存在哪里程序用到的時(shí)候如何找到變量呢所以需要一套規(guī)則來存儲(chǔ)變量方便之后再找到這套規(guī)則就成為作用域是一門編譯語言對(duì)于來說大部分情況下編譯發(fā)生在代碼執(zhí)行前的幾微妙的時(shí)間內(nèi)對(duì)于參與到一 首先,變量對(duì)于一個(gè)程序來說是一個(gè)很重要的角色, 那么問題來了 這些變量存在哪里,程序用到的時(shí)候如何找到變量呢? 所以需要一套規(guī)則來存儲(chǔ)變量方便之后...
摘要:為什么需要編碼規(guī)范為了提高工作效率,保證開發(fā)的有效性和合理性。在文件編碼中,選擇推薦在換行符中,選擇推薦文件命名程序的文件名和目錄名都采用有意義的英文命名。最后最后說的是,本規(guī)范不是強(qiáng)制,也不是標(biāo)準(zhǔn)。回復(fù)編碼規(guī)范即可。 為什么需要編碼規(guī)范? 為了提高工作效率,保證開發(fā)的有效性和合理性。 為了提高代碼可讀性和可重復(fù)利用性,從而節(jié)約溝通成本。 本文主要參考了 PEAR 規(guī)范,并進(jìn)行適當(dāng)...
摘要:箭頭函數(shù)首先是書寫方便其次是解決了指向全局的問題這里改為了指向當(dāng)前模塊化可以用來對(duì)外暴露函數(shù)外部通過來引入函數(shù)類里面的構(gòu)造函數(shù)寫在里面并且函數(shù)添加是用并沒有關(guān)鍵字繼承者用父類來繼承對(duì)象構(gòu)造函數(shù)要用到來引入繼承的構(gòu)造函數(shù)和類似數(shù)組但是不 1. 箭頭函數(shù) 首先是書寫方便 其次是解決了this指向全局的問題, 這里改為了指向當(dāng)前 2. es6模塊化 可以用export來對(duì)外暴露函數(shù), 外...
閱讀 1979·2019-08-30 15:54
閱讀 3605·2019-08-29 13:07
閱讀 3129·2019-08-29 12:39
閱讀 1795·2019-08-26 12:13
閱讀 1552·2019-08-23 18:31
閱讀 2166·2019-08-23 18:05
閱讀 1852·2019-08-23 18:00
閱讀 1051·2019-08-23 17:15