JavaScript函數物件建立、參數和作用域實例詳解
函數物件
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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

C++參數類型安全檢查透過編譯時檢查、執行時間檢查和靜態斷言確保函數只接受預期類型的值,防止意外行為和程式崩潰:編譯時類型檢查:編譯器檢查類型相容性。運行時類型檢查:使用dynamic_cast檢查類型相容性,不符則拋出異常。靜態斷言:在編譯時對型別條件進行斷言。

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

i9-12900H是14核心的處理器,使用的架構和工藝都是全新的,線程也很高,整體的工作都是很優秀的,一些參數都有提升特別的全面,是可以給用戶們帶來極佳體驗的。 i9-12900H參數評測大全評測:1、i9-12900H是14核心的處理器,採用了q1架構以及24576kb的製程工藝,提升到了20個執行緒。 2.最大的CPU頻率是1.80!5.00ghz,整體主要取決於工作的負載。 3.相比較價位來說還是特別合適的,性價比很不錯,對於一些需要正常使用的伙伴來說非常的合適。 i9-12900H參數評測大全性能跑分

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

js和vue的關係:1、JS作為Web開發基石;2、Vue.js作為前端框架的崛起;3、JS與Vue的互補關係;4、JS與Vue的實踐應用。

能打得過GPT-4的開源模型出現了!大模型競技場最新戰報:1040億參數開源模型CommandR+攀升至第6位,與GPT-4-0314打成平手,超過了GPT-4-0613。圖片這也是第一個在大模型競技場上擊敗GPT-4的開放權重模型。大模型競技場,可是大神Karpathy口中唯二信任的測試基準之一。圖片CommandR+來自AI獨角獸Cohere。這家大模型新創公司的共同創辦人兼CEO,正是Transformer最年輕作者AidanGomez(簡稱割麥子)。圖片這份戰報一出,又掀起了一波大模型社

vivox200ultra最新官方消息曝光了vivox200ultra參數及價格詳情,據悉vivox200ultra將搭載10倍潛望超長焦,價格大概在6999元起,可見其在拍照性能上佔據了絕對的優勢地位,下面是vivox200ultra參數及價格詳情,快來看看。一、vivox200ultra參數配置詳情1、vivox200ultra渲染圖由vivo X200 Ultra渲染圖來看,該機正面採用了無邊框的全面屏設計,整個手機正面的視覺效果可以說非常的無敵。 2、vivox200ultra有黑鷹框架
