JavaScript學習隨記——Function

? ? ? ?每個函數都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。由于函數是對象,因此函數名實際上也是一個指向函數對象的指針,不會于某個函數綁定。


函數的定義方式

<script type="text/javascript" charset="utf-8">/*** 	每個函數都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。* 由于函數是對象,因此函數名實際上也是一個指向函數對象的指針,不會于某個函數綁定。* 函數通常是使用函數聲明語法定義的,如下面的列子所示:*//*** @example 1:函數聲明式定義函數* * * @param {Object} num1* @param {Object} num2*/function sum(num1,num2){return num1+num2;}/*** @example 2: 函數表達式式定義函數* * @param {Object} num1* @param {Object} num2* @note: 代碼聲明了一個sum變量并將其初始化為一個函數*/var sum = function(num1,num2){return num1+num2;				};/*** @example 3:Function構造函數定義函數(不推薦使用)* * @syntax : var functionName = Function("參數1","參數2","參數3",...,"函數體");* @note:Function構造函數中最后一個參數是函數構造的函數體,其他的參數是函數構造的參數。* 		從技術角度講,這是一個函數表達式。但是,我們不推薦使用這種方法定義函數,因為這種語法會導致解析兩次代碼* (第一次是解析常規ECMAScript代碼,第二次是解析傳入函數中的字符串),從而影響性能。不過,這種語法對于理解* "函數是對象,函數名是指針"的概念是很非常直觀的。*/var sum = Function("num1","num2","return num1+num2;");
</script>


函數定義方式效率比較

<script type="text/javascript" charset="utf-8">//函數表達式式定義函數var start = Date.now();for(var i=0;i<10000;i++){var sum = function(num1,num2){return num1 + num2;};}var stop = Date.now();console.log("(10000次) 函數表達式式定義函數,總耗時: "+(stop-start));var start = Date.now();for(var i=0;i<100000;i++){var sum = function(num1,num2){return num1+num2;				};}var stop = Date.now();console.log("(100000次)函數表達式式定義函數,總耗時: "+(stop-start));//函數聲明式定義函數var start = Date.now();for(var i=0;i<10000;i++){function sum(num1,num2){return num1+num2;}}var stop = Date.now();console.log("(10000次) 函數聲明式定義函數,總耗時: "+(stop-start));var start = Date.now();for(var i=0;i<100000;i++){function sum(num1,num2){return num1+num2;}}var stop = Date.now();console.log("(100000次)函數聲明式定義函數,總耗時: "+(stop-start));//Function構造函數定義函數var start = Date.now();for(var i=0;i<100;i++){var sum = Function("num1","num2","return num1+num2;");}var stop = Date.now();console.log("(100次) Function構造函數定義函數,總耗時: "+(stop-start));var start = Date.now();for(var i=0;i<1000;i++){var sum = Function("num1","num2","return num1+num2;");}var stop = Date.now();console.log("(1000次)Function構造函數定義函數,總耗時: "+(stop-start));/********************* 【開始】運行結果 ********************(10000次) 函數表達式式定義函數,總耗時: 6(100000次)函數表達式式定義函數,總耗時: 47(10000次) 函數聲明式定義函數,總耗時: 12(100000次)函數聲明式定義函數,總耗時: 113(100次) Function構造函數定義函數,總耗時: 611(1000次)Function構造函數定義函數,總耗時: 5095********************* 【結束】運行結果 ********************/
</script>


不同定義方式的函數解析執行順序

<script type="text/javascript" charset="utf-8">/*** 解析器在向執行環境中加載數據時,對函數聲明和函數表達式并非一視同仁。* 解析器會率先讀取函數聲明,并使其在執行任何代碼之前可用(可以訪問);* 至于函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解析器執行。* * 例子如下:* 例子分析:受執行順序的影響,(函數是對象,函數名是指針)getName被后執行的表達式式定義的函數覆蓋*/var getName = function(){return "李四";};console.log(getName());function getName(){return "張三";}console.log(getName());/********************* 【開始】運行結果 ********************李四李四********************* 【結束】運行結果 ********************/	
</script>

函數共有的屬性和方法

?? ?? 屬性:
?? ? ??? ??? ?1、length:值為函數希望接受的參數的個數;
?? ? ??? ??? ?2、caller:保存著調用當前函數的函數的引用;
?? ? ??? ??? ?3、prototype:每個函數都有一個prototype屬性,這個屬性是指向一個對象的引用,這個對象稱為原型對象,原型對象包含函數實例共享的方法和屬性,也就是說將函數用作構造函數調用(使用new操作符調用)的時候,新創建的對象會從原型對象上繼承屬性和方法。在ECMAScript 5 中,prototype 屬性是不可枚舉的。
?? ?? 方法:
?? ? ??? ??? ?1、apply(socpe,argyArray):在特定的作用域中調用函數,實際上等于設置函數體內this對象的值。
?? ? ??? ??? ??? ?第一個參數(scope)表示運行函數的作用域,第二個參數是一個Array實例,也可以是arguments對象(函數調用時的參數)。
?? ? ??? ??? ?2、call(scope,arg1,arg2,arg3....):在特定的作用域中調用函數,實際上等于設置函數體內this對象的值。
?? ? ??? ??? ??? ?第一個參數(scope)表示運行函數的作用域,后面的參數都是函數調用時的參數。

<script type="text/javascript" charset="utf-8">/*** arguments 它是一個類似數組對象,包含著傳入函數中的所有參數。*/function sum(){var total = 0;for(var i=0;i<arguments.length;i++){total+=arguments[i];}return total;}console.log("sum(1): "+sum(1));console.log("sum(1,2): "+sum(1,2));console.log("sum(1,2,3): "+sum(1,2,3));console.log("sum(1,2,3,4): "+sum(1,2,3,4));/********************* 【開始】運行結果 ********************sum(1): 1sum(1,2): 3sum(1,2,3): 6sum(1,2,3,4): 10********************* 【結束】運行結果 ********************/	
</script>

<script type="text/javascript" charset="utf-8">/*** 定義階乘函數* @param {Object} num* * @note: 下面定義階乘的函數例子中,函數名字與函數執行體存在緊密的耦合* 在一起,因此想用其他的函數名時則需要修改函數體代碼。JavaScript提供* 了一種方式消除這種緊密耦合現象,就是使用 arguments.callee*/function factorial(num){if(num <= 1){return 1;}else{return num*factorial(num-1);}}console.log("factorial(5): "+factorial(5));/*** 定義階乘函數(函數名與代碼體無耦合關系)* arguments.callee: arguments的屬性,保存著arguments的所屬函數的引用,即 arguments.callee 等價于 arguments對象所屬函數。* @param {Object} num*/function factorial1(num){if(num <= 1){return 1;}else{return num * arguments.callee(num-1);}}console.log("factorial1(5): "+factorial1(5));/********************* 【開始】運行結果 ********************factorial(5): 120factorial1(5): 120********************* 【結束】運行結果 ********************/	
</script>

<script type="text/javascript" charset="utf-8">/*** function 中this指向的是函數的調用者,即誰調用了函數this就代表誰;*/window.name = "我乃是window";var zhangsan = {name:"我乃是張三"};var lisi = {name:"我是李四"};function getName(){return this.name;}console.log(getName.call(this));console.log(getName.call(window));console.log(getName.call(zhangsan));console.log(getName.call(lisi));/********************* 【開始】運行結果 ********************我乃是window我乃是window我乃是張三我是李四********************* 【結束】運行結果 ********************/	
</script>





本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

登錄id 黑蘋果_黑蘋果MacOSCatalina無法登錄AppStore修復

先上圖&#xff1a;慘紅色的提示信息&#xff0c;把你拒之App Store門外&#xff0c;但是對之放棄、不與之斗爭不是我們的節奏&#xff0c;請看破敵攻略&#xff1a;1.查看你的“關于本機”-->“概覽”-->“系統報告”&#xff0c;如圖&#xff1a;找到你的“網絡”-->…

我們三十以后才明白

當我們懂得珍惜時光的時候,已經發現自己不再年輕. 三十歲,才慢慢的明白. 男女三十而立&#xff0c;三十歲應該是人生的轉折點&#xff0c;它不是青春韶華的終結&#xff0c;而是生命的第二起跑線。 三十歲&#xff0c;面對的不應該是沒落&#xff0c;而是認知的新起點。很多曾…

Web開發的入門指導

Web開發的入門指導web開發編程技術你點開此文&#xff0c;說明你對Web開發是有興趣的&#xff0c;或者你正在思考開始學習Web開發。在這里&#xff0c;我會告訴你成為一名Web開發者的路線&#xff0c;是對初學者關于Web開發的指導。這篇文章不會教你如何寫代碼&#xff0c;而是…

新東方mti百科知識pdf_20南航翻碩mti初試417上岸經驗貼

南京航空航天大學mti初試417分排名第一:?基礎英語88:1&#xff0c;外刊閱讀:從2月到6月開始一直打卡外刊app&#xff0c;友鄰優課&#xff0c;流利閱讀等2&#xff0c;背單詞:扇貝單詞app&#xff0c;新東方專八單詞綠皮書&#xff0c;華研專八單詞等3&#xff0c;星火專八閱讀…

JavaScript學習隨記——屬性類型

<!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>屬性類型</title></head> <body><script type"text/javascript" charset"…

Shell if else語句

if 語句通過關系運算符判斷表達式的真假來決定執行哪個分支。Shell 有三種 if ... else 語句&#xff1a; if ... fi 語句&#xff1b;if ... else ... fi 語句&#xff1b;if ... elif ... else ... fi 語句。1) if ... else 語句 if ... else 語句的語法&#xff1a; if [ ex…

過濾日志中不相關的堆棧跟蹤行

我喜歡堆棧痕跡。 不是因為我喜歡錯誤&#xff0c;而是因為發生錯誤的那一刻&#xff0c;堆棧跟蹤是無價的信息源。 例如&#xff0c;在Web應用程序中&#xff0c;堆棧跟蹤向您顯示完整的請求處理路徑&#xff0c;從HTTP套接字到過濾器&#xff0c;Servlet&#xff0c;控制器&a…

Can't create/write to file '/tmp/#sql_887d_0.MYD' (Errcode: 17)

lsof |grep "#sql_887d_0.MYD" 如果沒有被占用就可以刪掉 。 https://wordpress.org/support/topic/cant-createwrite-to-file-error Hello, just today I saw this kind of error on every page on my blog. WordPress database error: [Cant create/write to file …

python3怎么創建文件_Python3.5 創建文件的簡單實例

實例如下所示&#xff1a;#codingutf-8Created on 2012-5-29author: xiaochouimport osimport timedef nsfile(s):The number of new expected documents#判斷文件夾是否存在&#xff0c;如果不存在則創建b os.path.exists("E:\\testFile\\")if b:print("File …

Dijkstra 最短路算法(只能計算出一條最短路徑,所有路徑用dfs)

上周我們介紹了神奇的只有五行的 Floyd 最短路算法&#xff0c;它可以方便的求得任意兩點的最短路徑&#xff0c;這稱為“多源最短路”。本周來來介紹指定一個點&#xff08;源點&#xff09;到其余各個頂點的最短路徑&#xff0c;也叫做“單源最短路徑”。例如求下圖中的 1 號…

JavaScript學習隨記——錯誤類型

錯誤類型&#xff1a; 執行代碼期間可能會發生的錯誤有多種類型。每種錯誤都有對應的錯誤類型&#xff0c;而當錯誤發生時&#xff0c;就會拋出相應類型的錯誤對象。 ECMA-262定義的7種錯誤類型 Error&#xff1a; 是錯誤的基類型&#xff0c;其他錯誤類型都繼承該類型。Error…

多個集合中的共同和獨特元素

本周&#xff0c;我們將暫時中斷較高級別的問題和技術文章&#xff0c;以解決我們中許多人可能面臨的一些代碼問題。 沒什么花哨的或太辛苦的&#xff0c;但是有一天它可能會節省您15分鐘的時間&#xff0c;偶爾回到基礎上也很不錯。 因此&#xff0c;讓我們開始吧。 有時&…

2016給自己一個交代

一、前言 在關于技術上的學習&#xff0c;常常有這樣那樣的計劃&#xff0c;而最終一個都沒有真正的落實。零散的學習&#xff0c;終究需要系統總結&#xff0c;才能使自己有所沉淀。從畢業至今&#xff0c;我一直在忙碌&#xff0c;為公司付出自己的很多很多&#xff0c;卻只不…

洛克人紅色思考型機器人叫什么_稻船敬二新企劃《紅色灰燼》 依然是機器人風格...

稻船敬二離開CAPCOM之后玩家們紛紛感嘆《洛克人》系列將再無續作&#xff0c;不過在單飛的這段時間里&#xff0c;稻船敬二還是創作了諸如《蒼藍雷霆 剛巴爾特》《Mighty No.9》等類似洛克人風格的作品。其名下的團隊comcept的最新作《Mighty No.9》即將于9月18日發售&#xff…

常見對話框

(1)普通對話框 // 點擊按鈕 彈出一個普通對話框public void click1(View v) {// 構建AlertDialogAlertDialog.Builder builder new Builder(this);builder.setTitle("警告");builder.setMessage("世界上最遙遠的距離是沒有網絡");builder.setPositiveButt…

JavaScript學習隨記——面向對象編程(繼承)

Example:基于原型鏈的繼承 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>面向對象編程&#xff08;OOP&#xff09;</title></head> <body>…

NSCharacterSet

先上個例子&#xff1a; NSString * str1 [nameInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; NSString * str2 [passwdInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; […

Apache Mahout:構建垃圾郵件過濾器服務器

Lucene發生了一些相當有趣的事情。 它最初是作為一個庫&#xff0c;然后其開發人員開始基于它添加新項目。 他們開發了另一個開源項目&#xff0c;該項目將向Lucene添加爬網功能&#xff08;以及其他功能&#xff09;。 Nutch實際上是任何人都可以使用或修改的功能齊全的Web Se…

建模步驟_古建設計 | sketchup建模步驟教程(簡易入門版)

前言本篇教程主要是針對古建建模入門者。小N給大家分享一套我相對簡易的建模步驟。(PS&#xff1a;但是估計有些人可能會感覺我做的東西已經繁瑣了……)因為主要是為了讓大家熟悉、入門和好記憶。所以講的東西&#xff0c;小N我會相對簡單&#xff0c;有些細節的內容不會更多展…

JavaScript模塊化

JavaScript模塊化的實現方式&#xff1a; <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>模塊化</title></head> <body><script type&quo…