摘要:在中,函數(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 4Function的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ù)是有效的。
雖然沒有重載,但是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
摘要:在中,并沒有對抽象類和接口的支持。例如,當(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是一門典型...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態(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言的類式繼承,而...
摘要:有一函數(shù)若是用來生成對象,則稱為構(gòu)造函數(shù)名。屬性指定了使用該構(gòu)造函數(shù)生成的對象實例繼承了哪個對象實例。因此,只要利用,就能在構(gòu)造函數(shù)中,為未來利用此構(gòu)造函數(shù)生成的對象實例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向?qū)ο蟛⒎且蕾囉诔橄蟮念?,而是通過原型鏈,將一個個具體的對象實例進(jìn)行連接,位于原型鏈下游的對象實例可以讀取/使用位于上游的對象實例的屬性/...
摘要:不必在構(gòu)造函數(shù)中定義對象實例的信息。其次,按照一切事物皆對象的這餓極本的面向?qū)ο蟮姆▌t來說,類本身并不是一個對象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個對象。第二個問題就是在創(chuàng)建子類型的實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計中各出沒。寫這篇文章,主要參考與JavaScrip...
摘要:動態(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)該書對這方面的知識點介紹的很易于理解,因此...
摘要:目錄導(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 與...
閱讀 2912·2021-11-25 09:43
閱讀 2338·2021-11-24 09:39
閱讀 2720·2021-09-23 11:51
閱讀 1413·2021-09-07 10:11
閱讀 1458·2019-08-27 10:52
閱讀 1946·2019-08-26 12:13
閱讀 3366·2019-08-26 11:57
閱讀 1405·2019-08-26 11:31