函數物件
1.1 建立函數
建立JavaScript函數的一種不常用的方式(幾乎沒有人用)是透過new運算元來作用於Function“建構器」:
var funcName = new Function( [argname1, [... argnameN,]] body );
參數清單中可以有任意多的參數,然後緊接著是函數體,例如:
var add = new Function("x", "y", "return(x+y)"); print(add(2, 4));
將會列印結果:
6
但是,誰會用如此難用的方式來創建一個函數呢?如果函數體比較複雜,那拼接這個String要花費很大的力氣,所以JavaScript提供了一種語法糖,即通過字面量來創建函數:
function add(x, y){ return x + y; }
或:
var add = function(x, y){ return x + y; }
事實上,這樣的語法糖更容易使傳統領域的程式設計師產生誤解,function關鍵字會呼叫Function來new一個對象,並將參數表和函數體準確的傳遞給Function的建構器。
通常來說,在全域作用域(作用域將在下一節詳細介紹)內聲明一個對象,只不過是對一個屬性賦值而已,比如上例中的add函數,事實上只是為全局對象添加了一個屬性,屬性名為add,而屬性的值是一個對象,即function(x, y){return x+y;},理解這一點很重要,這條語句在語法上跟:
var str = "This is a string";
並無二致。都是給全域物件動態的增加一個新的屬性,如此而已。
為了說明函數跟其他的物件一樣,都是作為一個獨立的物件而存在於JavaScript的運行系統,我們不妨看這樣一個例子:
function p(){ print("invoke p by ()"); } p.id = "func"; p.type = "function"; print(p); print(p.id+":"+p.type); print(p());
沒有錯,p雖然引用了一個匿名函數(物件),但是同時又可以擁有屬性,完全跟其他物件一樣,運行結果如下:
function (){ print("invoke p by ()"); } func:function invoke p by ()
1.2 函數的參數
在JavaScript中,函數的參數是比較有趣的,例如,你可以將任意多的參數傳遞給一個函數,即使這個函數宣告時並未制定形式參數,例如:
function adPrint(str, len, option){ var s = str || "default"; var l = len || s.length; var o = option || "i"; s = s.substring(0, l); switch(o){ case "u": s = s.toUpperCase(); break; case "l": s = s.toLowerCase(); break; default: break; } print(s); } adPrint("Hello, world"); adPrint("Hello, world", 5); adPrint("Hello, world", 5, "l");//lower case adPrint("Hello, world", 5, "u");//upper case
函數adPrint在宣告時接受三個形式參數:要列印的字串,要列印的長度,是否轉換為大小寫的標記。但是在呼叫的時候,我們可以依序傳遞給adPrint一個參數,兩個參數,或是三個參數(甚至可以傳遞給它多於3個,沒有關係),運行結果如下:
Hello, world Hello hello HELLO
事實上,JavaScript在處理函數的參數時,與其他編譯型的語言不一樣,解釋器傳遞給函數的是一個類似陣列的內部值,叫arguments,這個在函數物件產生的時候就被初始化了。例如我們傳遞給adPrint一個參數的情況下,其他兩個參數分別為undefined.這樣,我們可以才adPrint函數內部處理那些undefined參數,從而可以向外部公開:我們可以處理任意參數。
我們透過另一個例子來討論這個神奇的arguments:
function sum(){ var result = 0; for(var i = 0, len = arguments.length; i < len; i++){ var current = arguments[i]; if(isNaN(current)){ throw new Error("not a number exception"); }else{ result += current; } } return result; } print(sum(10, 20, 30, 40, 50)); print(sum(4, 8, 15, 16, 23, 42));//《迷失》上那串神奇的数字 print(sum("new"));
函數sum沒有顯式的形參,而我們又可以動態的傳遞給其任意多的參數,那麼,如何在sum函數中如何引用這些參數呢?這裡就需要用到arguments這個偽數組了,運行結果如下:
150 108 Error: not a number exception
函數作用域
作用域的概念在幾乎所有的主流語言中都有體現,在JavaScript中,則有其特殊性:JavaScript中的變數作用域為函數體內有效,而無區塊作用域,我們在Java語言中,可以這樣定義for循環區塊中的下標變數:
public void method(){ for(int i = 0; i < obj1.length; i++){ //do something here; } //此时的i为未定义 for(int i = 0; i < obj2.length; i++){ //do something else; } }
而在JavaScript中:
function func(){ for(var i = 0; i < array.length; i++){ //do something here. } //此时i仍然有值,及I == array.length print(i);//i == array.length; }
JavaScript的函數是在局部作用域內運作的,在局部作用域內運行的函數體可以存取其外層的(可能是全域作用域)的變數和函數。 JavaScript的作用域為詞法作用域,所謂詞法作用域是說,其作用域為在定義時(詞法分析時)就確定下來的,而並非在執行時確定,如下例:
var str = "global"; function scopeTest(){ print(str); var str = "local"; print(str); } scopeTest();
運行結果是什麼?初學者很可能得出這樣的答案:
global local
而正確的結果應該是:
undefined local
因為在函數scopeTest的定義中,預先存取了未宣告的變數str,然後才對str變數進行初始化,所以第一個print(str)會回傳undifined錯誤。那為什麼函數這個時候不去存取外部的str變數呢?這是因為,在詞法分析結束後,建構作用域鏈的時候,會將函數內定義的var變數放入該鏈,因此str在整個函數scopeTest內都是可見的(從函數體的第一行到最後一行),由於str變數本身是未定義的,程式順序執行,到第一行就會回傳未定義,第二行為str賦值,所以第三行的print(str)將返回”local”。
以上是JavaScript函數物件建立、參數和作用域實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版
好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器