摘要:在中,函數(shù)也是以對象的形式存在的。也可以使用對象作為參數(shù)返回值調(diào)用該函數(shù)的返回結(jié)果。調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。默認(rèn)名字的函數(shù)被稱之為匿名函數(shù)。內(nèi)部函數(shù)在函數(shù)中聲明內(nèi)嵌函數(shù),內(nèi)嵌函數(shù)對函數(shù)中的局部變量進(jìn)行訪問。
Function類型 Function與函數(shù)
函數(shù)它只定義一次,但可能被執(zhí)行或調(diào)用多次 。
Function類型是JavaScript提供的引用類型之一,通過Function類型創(chuàng)建Function對象。
在JavaScript中,函數(shù)也是以對象的形式存在的。每個函數(shù)都是一個Function對象。函數(shù)名,本質(zhì)就是一個變量名,是指向某個Function對象的引用。
// 1.函數(shù)聲明方式 function fun(){ console.log("this is function"); } // 2.字面量方式 var fn = function(){ console.log("this is function too"); } // 判斷函數(shù)是否為Function類型的 console.log(fun instanceof Function);// true console.log(fn instanceof Function);// true // JavaScript中所有的函數(shù)都是Function類型的對象 /* 3.創(chuàng)建Function類型的對象 -> 是一個函數(shù) var 函數(shù)名 = new Function(參數(shù),函數(shù)體); * 由于函數(shù)的參數(shù)和函數(shù)體都是以字符串形式傳遞給Function的 */ var f = new Function("a","console.log(a)"); f(100);// 以函數(shù)方式進(jìn)行調(diào)用Function類型 構(gòu)造函數(shù)
在JavaScript中,函數(shù)除了可以通過函數(shù)定義語句或字面量表達(dá)式兩種方式定義之外,還可以通過Function類型進(jìn)行定義。(注意:通過Function類型定義函數(shù)的效率遠(yuǎn)不如通過函數(shù)定義語句或字面量表達(dá)式兩種方式定義。目前,定義函數(shù)具有三種方式,這三種方式之間存在一定的差別。)
// 1.Object與Function都是自身的類型 console.log(Object instanceof Object);// true console.log(Function instanceof Function);// true // 2.Object自身是構(gòu)造函數(shù),而構(gòu)造函數(shù)也是函數(shù),是函數(shù)都是Function類型 console.log(Object instanceof Function);// true // 3.Function是引用類型,用于創(chuàng)建對象,是對象都是Object類型 console.log(Function instanceof Object);// true
// 變量的聲明提前 console.log(v);// undefined var v = 100; // 如果使用函數(shù)聲明方式定義函數(shù)時 -> 函數(shù)的聲明提前 fun(); function fun(){ console.log("this is function"); }apply()方法
Function的apply()方法用于調(diào)用一個函數(shù),并且接受指定的this值,以及一個數(shù)組作為參數(shù)。
語法結(jié)構(gòu):
1.thisArg參數(shù):可選項(xiàng),在func函數(shù)運(yùn)行時使用this值。
2.argsArray參數(shù):可選項(xiàng),一個數(shù)組或者類數(shù)組對象,其中你那個的數(shù)組元素將作為多帶帶的參數(shù)傳給func函數(shù)。也可以使用argments對象作為參數(shù)
3.返回值:調(diào)用該函數(shù)的返回結(jié)果。
// 定義函數(shù) function fun(value){ console.log("this is " + value); } // 函數(shù)的調(diào)用方式 fun("function");// 語法結(jié)構(gòu):函數(shù)名稱() apply(thisArg,argArray)方法 -> 用于調(diào)用一個指定函數(shù) 參數(shù) thisArg - this argArray - 數(shù)組,作為參數(shù)(實(shí)參)的列表 fun.apply(null, ["function"]);call()方法
Function的call()方法用于調(diào)用一個函數(shù),并且接收指定的this值作為參數(shù),以及參數(shù)列表。
語法結(jié)構(gòu):
1.thisArg參數(shù):在func函數(shù)運(yùn)行時使用的this值。
2.arg1,arg2,...參數(shù):指定的參數(shù)列表。
3.返回值:調(diào)用該函數(shù)的返回結(jié)果。
apply()與call()非常相似,不同之處在于提供參數(shù)的方式。
Function的bind()方法用于創(chuàng)建一個新的函數(shù)(稱之為綁定函數(shù)),并且接收指定的this值作為參數(shù),以及參數(shù)列表。
// 定義函數(shù) function fun(value){ console.log("this is " + value); } /* bind(thisArg, arg1, arg2, ...)方法 * 作用 - 用于創(chuàng)建一個新函數(shù)(稱為綁定函數(shù)) * 參數(shù) * thisArg - this arg1, arg2, ... - 表示參數(shù)列表 * 返回值 - 返回新的函數(shù) */ // var f = fun.bind();// 相對于從指定函數(shù)復(fù)制一份出來 // console.log(f); // f(); fun("周芷若");// this is 周芷若 var f = fun.bind(null, "張無忌"); f();// this is 張無忌沒有重載
在其他開發(fā)語言中,函數(shù)具有一種特性,叫做重載。所謂的重載,就是定義多個同名的函數(shù),但每一個函數(shù)接收的參數(shù)的個數(shù)不同,程序會根據(jù)調(diào)用是傳遞的實(shí)參個數(shù)進(jìn)行判斷,具體調(diào)用的是哪個函數(shù)。
// 定義函數(shù) function fun(value){ console.log("this is " + value); } bind(thisArg, arg1, arg2, ...)方法 作用 - 用于創(chuàng)建一個新函數(shù)(稱為綁定函數(shù)) 參數(shù) thisArg - this arg1, arg2, ... - 表示參數(shù)列表 返回值 - 返回新的函數(shù) var f = fun.bind();// 相對于從指定函數(shù)復(fù)制一份出來 console.log(f); f(); fun("周芷若");// this is 周芷若 var f = fun.bind(null, "張無忌"); f();// this is 張無忌
但在JavaScript中函數(shù)時沒有重載現(xiàn)象的。也就是說,如果同時定義多個同名函數(shù),只有最后一個定義的函數(shù)時有效的。
不過,JavaScript提供的arguments對象,該對象可以模擬函數(shù)重載的現(xiàn)象。arguments對象是函數(shù)內(nèi)部的本地變量;arguments已經(jīng)不再是函數(shù)的屬性了。
arguments對象可以獲取函數(shù)的所有參數(shù),但arguments對象并不是一個數(shù)組,而是一個類數(shù)組對象(沒有數(shù)組特有的方法)。
在一個函數(shù)體內(nèi),如果想調(diào)用自身函數(shù)的話,有兩種方式;
1.通過使用自身函數(shù)實(shí)現(xiàn)
2.通過使用arguments對象的callee屬性實(shí)現(xiàn)。
調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。在某種意義上,遞歸近似于循環(huán)。兩者都重復(fù)執(zhí)行相同的代碼,并且兩者都需要一個終止條件以避免無限循環(huán)或者無限遞歸。
/* 函數(shù)的遞歸 -> 就是在指定函數(shù)的函數(shù)體中調(diào)用自身函數(shù) function fun(){ // 當(dāng)前函數(shù)的邏輯內(nèi)容 console.log("this is function"); // 調(diào)用自身函數(shù) -> 實(shí)現(xiàn)遞歸 fun(); } fun(); */ function fn(v){ console.log(v); if (v >= 10) { return; } // fn(v + 1); arguments.callee(v + 1); } fn(0);//導(dǎo)致出錯 var f = fn; fn = null; f(0); // console.log(f);特殊函數(shù) 匿名函數(shù)
JavaScript可以將函數(shù)作為數(shù)據(jù)使用。作為函數(shù)本體,他就像普通的數(shù)據(jù)一樣,不一定要有名字。默認(rèn)名字的函數(shù)被稱之為匿名函數(shù)。
匿名函數(shù)的兩種用法:
1.可以將匿名函數(shù)作為從參數(shù)傳遞給其他函數(shù)。這樣,接收函數(shù)就能利用所傳遞的函數(shù)來完成某些事請。
2.可以定義某個匿名函數(shù)來執(zhí)行某些一次性任務(wù)。
JavaScript語法中,定義函數(shù)必須定義函數(shù)名稱 -> 匿名函數(shù) function (){ console.log("this is function"); } 匿名函數(shù)的作用: 1.將匿名函數(shù)作為參數(shù)傳遞給其他函數(shù) -> 回調(diào)函數(shù) 2.將匿名函數(shù)用于執(zhí)行一次性任務(wù) -> 自調(diào)函數(shù)回調(diào)函數(shù)
當(dāng)一個函數(shù)作為參數(shù)傳遞給另一個函數(shù)時,作為參數(shù)的函數(shù)被稱之為回調(diào)函數(shù)。
// 作為另一個函數(shù)(fn)的參數(shù)的函數(shù)(one) -> 回調(diào)函數(shù) var one = function(){ return 1; } function fn(v){ return v(); } // one函數(shù)僅是作為fn函數(shù)的參數(shù)出現(xiàn) -> 并不是調(diào)用 // var result = fn(one); /* 以上代碼等價于以下代碼 以下代碼中作為參數(shù)的函數(shù) -> 匿名回調(diào)函數(shù) */ var result = fn(function(){return 1;}); console.log(result);// 1自調(diào)函數(shù)
所謂自調(diào)函數(shù)就是在定義函數(shù)后自行調(diào)用。
1.第一對括號的作用,放置的是一個匿名函數(shù)。匿名函數(shù)接受一個參數(shù)
2.第二個對括號的作用,是‘立即調(diào)用’。在調(diào)用時,向匿名函數(shù)傳遞參數(shù)內(nèi)內(nèi)容。
自調(diào)函數(shù)只需將匿名函數(shù)的定義放進(jìn)一對括號中,然后外面在跟一個對括號。
自調(diào)函數(shù) - 定義即調(diào)用的函數(shù) 第一個小括號 - 用于定義函數(shù) 第二個小括號 - 用于調(diào)用函數(shù) // 全局作用域 - 生命周期:JavaScript文件從執(zhí)行到執(zhí)行完畢 (function(value){ // 函數(shù)作用域 - 生命周期:從函數(shù)調(diào)用到調(diào)用完畢 console.log("this is " + value); })("function"); // 表達(dá)式語法 (function(value){ // 函數(shù)作用域 - 生命周期:從函數(shù)調(diào)用到調(diào)用完畢 console.log("this is " + value); }("function")); !function(value){ // 函數(shù)作用域 - 生命周期:從函數(shù)調(diào)用到調(diào)用完畢 console.log("this is " + value); }("function"); +function(value){ // 函數(shù)作用域 - 生命周期:從函數(shù)調(diào)用到調(diào)用完畢 console.log("this is " + value); }("function");作為值的函數(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()());閉包 作用域鏈
很多開發(fā)語言中都具有塊級作用域,但ECMAScript5版本中并沒有跨級作用域,這經(jīng)常會導(dǎo)致理解上的困惑。
雖然ECMAScript5版本沒有塊級作用域,但具有函數(shù)作用域。在某個函數(shù)內(nèi)部定義的變量的作用域就是該函數(shù)作用域。
每一段JavaScript代碼(全局代碼或函數(shù))都有一個與之關(guān)聯(lián)的作用域。這個作用域鏈?zhǔn)且粋€對象列表或鏈表,這組最想定義了這段代碼“作用域中”的變量。
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();閉包是什么
JavaScript允許函數(shù)嵌套,并且內(nèi)部函數(shù)可以訪問定義在外部函數(shù)中的所有變量和函數(shù),以及外部函數(shù)能訪問的所有變量和函數(shù)。但是,外部函數(shù)卻不能訪問定義在內(nèi)部函數(shù)中的變量和函數(shù)。
當(dāng)內(nèi)部函數(shù)以某種方式唄任何一個外部函數(shù)作用域訪問時,一個閉包就產(chǎn)生了。
閉包就是詞法表示包括不必計(jì)算的變量的函數(shù),也就是說,該函數(shù)能使用函數(shù)外定義的變量。
var n;// 定義變量,但不初始化值 function fun(){// 函數(shù)作用域 var v = 100; // 進(jìn)行初始化值 -> 一個函數(shù) n = function(){ console.log(v); } // n(); } fun(); n();// 100
閉包的特點(diǎn)和作用
特點(diǎn):
1.局部變量:在函數(shù)中定義有共享意義的局部變量。
2.內(nèi)部函數(shù):在函數(shù)(f)中聲明內(nèi)嵌函數(shù),內(nèi)嵌函數(shù)(g)對函數(shù)(f)中的局部變量進(jìn)行訪問。
3.外部使用:函數(shù)(f)向外返回此內(nèi)嵌函數(shù)(g),外部可以通過此內(nèi)嵌函數(shù)持有并訪問聲明在函數(shù)(f)中的局部變量,而此變量在外部是通過其他途徑無法訪問的。
作用
1.提供可共享的局部變量。
2.保護(hù)共享的局部變量。提供專門的讀寫變量的函數(shù)。
3.避免全局污染。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/108228.html
摘要:在中,并沒有對抽象類和接口的支持。例如,當(dāng)對象需要對象的能力時,可以有選擇地把對象的構(gòu)造器的原型指向?qū)ο螅瑥亩_(dá)到繼承的效果。本節(jié)內(nèi)容為設(shè)計(jì)模式與開發(fā)實(shí)踐第一章筆記。 動態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動態(tài)類型語言。 靜態(tài)類型語言在編譯時已確定變量類型,動態(tài)類型語言的變量類型要到程序運(yùn)行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態(tài)類型語言的面向接口編程不一而足。對象對他自己的行為負(fù)責(zé),其他對象不關(guān)心它的內(nèi)部實(shí)現(xiàn)。 ‘工欲善其事,必先利其器’,在深入學(xué)習(xí)JavaScript之前,我認(rèn)為我們很有必要了解以下,JavaScript這門面向?qū)ο蟮膭討B(tài)語言到底是一門什么樣的語言。 JavaScript vs 其他面向?qū)ο笳Z言 它沒有使用像Java等傳統(tǒng)的面向?qū)ο笳Z言的類式繼承,而...
摘要:前言面向?qū)ο缶幊淌菍⑿枨蟪橄蟪梢粋€對象,針對對象分析其特征屬性和動作方法。面向?qū)ο缶幊趟枷肫渲幸粋€特點(diǎn)就是封裝,就是把需要的功能放在一個對象里。將閉包作為創(chuàng)建對象的構(gòu)造函數(shù)。 前言 面向?qū)ο缶幊淌菍⑿枨蟪橄蟪梢粋€對象,針對對象分析其特征(屬性)和動作(方法)。這個對象我們稱之為類。面向?qū)ο缶幊趟枷肫渲幸粋€特點(diǎn)就是封裝,就是把需要的功能放在一個對象里。但是JavaScript這種解釋性的...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:對象在中,除了數(shù)字字符串布爾值這幾個簡單類型外,其他的都是對象。那么在函數(shù)對象中,這兩個屬性的有什么區(qū)別呢表示該函數(shù)對象的原型表示使用來執(zhí)行該函數(shù)時這種函數(shù)一般成為構(gòu)造函數(shù),后面會講解,新創(chuàng)建的對象的原型。這時的函數(shù)通常稱為構(gòu)造函數(shù)。。 本文原發(fā)于我的個人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請?jiān)L問個人博客。 最近工作一直在用nodejs做開發(fā),有了nodejs,...
摘要:這樣每個實(shí)例獨(dú)享自己的屬性,并和其他同類型的實(shí)例共享方法構(gòu)造函數(shù)原型以上這種方式定義的類型,可以通過來判斷一個實(shí)例是否是類型的實(shí)際上是通過實(shí)例的原型鏈來判斷一個對象是否某個類型的實(shí)例的,具體的細(xì)節(jié)后面會詳細(xì)介紹。 JavaScript面向?qū)ο缶幊? 如何定義自定義類型 首先需要明確,JavaScript并不是傳統(tǒng)意義上的OO語言,它并沒有class的概念, 而是包含了另一套異常強(qiáng)大的...
閱讀 1702·2021-11-25 09:43
閱讀 2665·2019-08-30 15:53
閱讀 1808·2019-08-30 15:52
閱讀 2897·2019-08-29 13:56
閱讀 3317·2019-08-26 12:12
閱讀 565·2019-08-23 17:58
閱讀 2126·2019-08-23 16:59
閱讀 931·2019-08-23 16:21