摘要:在中,函數也是以對象的形式存在的,每個函數都是一個對象。可以定一某個匿名函數執行某些一次性任務。定義變量,但不初始化值函數作用域進行初始化值一個函數閉包的作用提供可享的局部變量保護共享的局部變量,提專門讀寫變量的函數避免全局污染
Function與函數
Function是JavaScript提供的一種引用類型,通過Function類型創建Function對象。
在JavaScript中,函數也是以對象的形式存在的,每個函數都是一個Function對象。
//字面量方式創建函數 var fun =function () { console.log(100) }; //函數聲明方式創建函數 function fn () { console.log(200) }; /* 創建Funtion類型的對象 * var 函數名 = new Function("參數",""函數體)*/ var f = new Function("a","console.log(a)"); f(2);//以函數方式調用Function類型 Function的apply()方法
Function的apply()方法用于調用一個函數,并且接受指定的this值,以及一個數組作為參數。
//定義函數 function fun(value) { console.log(value) } /* 函數的apply()方法——>用于調用一個函數 函數名.apply(thisArg,[argsArray]) thisArg——>可選項,函數運行時使用的this值 argsArray——>可選項,一個數組或者類數組對象,其中的元素作為多帶帶的參數傳給Function函數。*/ fun.apply(null,["100"]);Function的call()方法
Function的call()方法用于調用一個函數,并且接受指定的this值,以及參數列表。
var fun = function (value,a,b,) { console.log(value,a,b,) } /* * call()方法調用函數 * 函數名.call(thisArg,arg1,arg2,…) * * 和apply()的區別在于提供參數的方式不同 */ fun.call(null,2,3,4);//2 3 4Function的bind方法
Function用于創造一個新的函數,稱為綁定函數,并且接受指定的this值作為參數,以及參數列表
var fun = function (a,b,c) { console.log( a,b,c) } /* bind方法->相當于復制一份當前函數 * 函數名.bind(thisArg,arg1,arg2,...) * thisArg->當綁定函數被調用時,該屬性作為原函數運行時的this指向 * arg->參數。當綁定函數被調用時,這些參數將在實參之前傳遞給被綁定的方法 * */ var v =fun.bind(null,2,3,4); v();//2 3 4沒有重載
在其他開發語言中,函數有一種特性叫做重載。就是定義多個同名的函數,但沒一個函數接收的參數個數不同,程序會根據調用時傳遞的實參個數進行判斷,具體調用的是哪個函數。
單JavaScript中函數是沒有重疊現象的,如果定義多個同名的函數,只有最后一個定義的函數是有效的。
雖然沒有重載,但是JavaScript提供了argumengs對象可以模擬函數重載的現象。
/* * argumengs對象 * *該對象存儲當前函數中所有的參數(實參)->類數組對象 * *該對象一般用于函數中 * *作用-用于獲取當前函數的所有參數 * *arguments.length->函數所有參數(實參)的個數*/ function fun() { var num = arguments.length; switch (num){ case 2://參數個數 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遞歸
在函數體內調用自身的函數被稱之為遞歸函數。在某種意義上來說,遞歸近似于循環。兩者都重復執行相同的代碼,都需要一個終止條件來避免無限循環和無限遞歸。
在一個函數體內,想要調用自身函數,有一下兩種方式
通過使用自身函數名實現
通過使用arguments對象的callee屬性來實現
/*//無線遞歸 function fun() { console.log("23") fun()//調用自身函數,實現遞歸 } fun()*/ function fn(v) { console.log(v); if (v>=5){ return } /*fn(v+1)*///使用該方法終止遞歸當執行下列代碼輸出時,報錯 arguments.callee(v+1) } /*fn(0)*/ var f = fn; fn=null; f(0);特殊函數 匿名函數
在JavaScript中,當把函數當做數據使用時,可以不設置名字。匿名函數的兩種用法
可以將匿名函數作為參數傳給其他函數。
可以定一某個匿名函數執行某些一次性任務。
回調函數當一個函數作為另一個函數的參數時,作為參數的函數被稱之為回調函數。
//作為另一個函數參數的函數fun->回調函數 var fun = function () { return 2; }; function fn(v) { return v(); } /* var result=fn(fun);//函數fun作為函數fn的實參 console.log(result); */ //以上代碼等同于以下代碼 //以下代碼中作為參數的函數->匿名回調函數 var f = fn(function(){return 2;}); console.log(f);自調函數
自調函數就是在定義函數后自行調用
/* 自調函數->定義即調用的函數 * 相當于在匿名函數外加了小括號 * 第一對括號->定義函數 * 第二對括號->調用函數*/ (function () { console.log("23") })()//23->后邊的括號表示調用作為值的函數
一個函數作為另一個函數的結果進行返回,作為結果返回的函數稱之為作為值的函數
var one = function(){ return 100; } // 作為值的函數 -> 內部函數的一種特殊用法 function fun(){ var v = 100; // 內部函數 return function(){ return v; }; } var result = fun(); // console.log(result);// one函數 // console.log(result());// 100 console.log(fun()());閉包 作用域鏈
作用域鏈就是指局部作用域可以訪問它的父級所能訪問的作用域
var a = 10;// 全局變量 function fun(){ var b = 100;// fun函數作用域的局部變量 // 內部函數 function fn(){ var c = 200;// fn函數作用域的局部變量 // 內部函數 function f(){ var d = 300;// f函數作用域的布局變量 // 調用變量 console.log(a);// 10 console.log(b);// 100 console.log(c);// 200 console.log(d);// 300 } f(); // 調用變量 // console.log(a);// 10 // console.log(b);// 100 // console.log(c);// 200 // console.log(d);// d is not defined } fn(); // 調用變量 // console.log(a);// 10 // console.log(b);// 100 // console.log(c);// c is not defined // console.log(d);// d is not defined } fun();閉包
當內部任何一個函數被通過一種方式被任何一個外部作用域訪問時,就是一個閉包。
var n;// 定義變量,但不初始化值 function fun(){// 函數作用域 var v = 100; // 進行初始化值 -> 一個函數 n = function(){ console.log(v); } // n(); } fun(); n();// 100
閉包的作用
提供可享的局部變量
保護共享的局部變量,提專門讀寫變量的函數
避免全局污染
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108242.html
摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構造器的原型指向對象,從而達到繼承的效果。本節內容為設計模式與開發實踐第一章筆記。 動態類型語言 編程語言按數據類型大體可以分為兩類:靜態類型語言與動態類型語言。 靜態類型語言在編譯時已確定變量類型,動態類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態類型語言的面向接口編程不一而足。對象對他自己的行為負責,其他對象不關心它的內部實現。 ‘工欲善其事,必先利其器’,在深入學習JavaScript之前,我認為我們很有必要了解以下,JavaScript這門面向對象的動態語言到底是一門什么樣的語言。 JavaScript vs 其他面向對象語言 它沒有使用像Java等傳統的面向對象語言的類式繼承,而...
摘要:有一函數若是用來生成對象,則稱為構造函數名。屬性指定了使用該構造函數生成的對象實例繼承了哪個對象實例。因此,只要利用,就能在構造函數中,為未來利用此構造函數生成的對象實例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向對象并非依賴于抽象的類,而是通過原型鏈,將一個個具體的對象實例進行連接,位于原型鏈下游的對象實例可以讀取/使用位于上游的對象實例的屬性/...
摘要:不必在構造函數中定義對象實例的信息。其次,按照一切事物皆對象的這餓極本的面向對象的法則來說,類本身并不是一個對象,然而原型方式的構造函數和原型本身也是個對象。第二個問題就是在創建子類型的實例時,不能向超類型的構造函數中傳遞參數。 前言 對象(Object)應該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設計中各出沒。寫這篇文章,主要參考與JavaScrip...
摘要:動態類型語言和鴨子類型編程語言按照數據類型大體可分為靜態類型語言和動態類型語言。鴨子類型的概念至關重要,比如一個對象有了屬性,也可以依照下標來存取屬性,這個對象就可以被當做數組來使用。 前言 曾經對Javascript的面向對象相關知識也有過了解,從各種博客、書籍上也學到了很多。但是最近在看《Javascript設計模式與開發實戰》這本書時發現該書對這方面的知識點介紹的很易于理解,因此...
摘要:目錄導語理解對象和面向對象的程序設計創建對象的方式的繼承機制原型對象原型鏈與原型對象相關的方法小結導語前面的系列文章,基本把的核心知識點的基本語法標準庫等章節講解完本章開始進入核心知識點的高級部分面向對象的程序設計,這一部分的內容將會對對象 目錄 導語 1.理解對象和面向對象的程序設計 2.創建對象的方式 3.JavaScript的繼承機制 3.1 原型對象 3.2 原型鏈 3.3 與...
閱讀 2908·2021-11-25 09:43
閱讀 2328·2021-11-24 09:39
閱讀 2717·2021-09-23 11:51
閱讀 1407·2021-09-07 10:11
閱讀 1455·2019-08-27 10:52
閱讀 1938·2019-08-26 12:13
閱讀 3359·2019-08-26 11:57
閱讀 1399·2019-08-26 11:31