首頁 web前端 js教程 JavaScript函數物件建立、參數和作用域實例詳解

JavaScript函數物件建立、參數和作用域實例詳解

Jul 25, 2017 am 11:29 AM
javascript js 參數

函數物件

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

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

C++ 函式參數型別安全檢查 C++ 函式參數型別安全檢查 Apr 19, 2024 pm 12:00 PM

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

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 Dec 18, 2023 pm 03:39 PM

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

i9-12900H參數評測大全 i9-12900H參數評測大全 Feb 23, 2024 am 09:25 AM

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

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

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

js和vue的關係 js和vue的關係 Mar 11, 2024 pm 05:21 PM

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

開源模型首勝GPT-4!競技場最新戰報引熱議,Karpathy:這是我唯二信任的榜單 開源模型首勝GPT-4!競技場最新戰報引熱議,Karpathy:這是我唯二信任的榜單 Apr 10, 2024 pm 03:16 PM

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

vivox200ultra參數及價格詳情 vivox200ultra參數及價格詳情 Jun 28, 2024 pm 01:23 PM

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

See all articles