JavaScript高階程式設計學習4 傳遞引數

2021-08-25 02:20:28 字數 1276 閱讀 4567

ecmascript中所有的函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另外乙個變數一樣。基本型別值的傳遞如同基本型別變數的複製一樣,如下例:

let num1 = 5;

let num2 = num1;

alert(num2);//5

引用型別值的傳遞,如同引用型別變數的複製一樣,如下例:

let obj1 = new object();

let obj2 = obj1;

obj1.name = "nico";

alert(obj2.name);//"nico"

也就是說,obj1和obj2都指向堆記憶體中的同乙個物件,改變obj1後obj2也會改變。

下面理解函式傳遞引數

在向引數傳遞基本型別的值時,被傳遞的值會複製給乙個區域性變數(即命名引數,或者arguments物件中的乙個元素)。在向引數傳遞引用型別的值時,也會把這個值在記憶體中的位址複製給乙個區域性變數,因此這個區域性變數的變化會反映在函式的外部。如下例:

function add(num)

let a = 20;

let result = add(a);

alert(a);//20,無變化

alert(result);//30

如果使用物件則如下:

function set(obj)

let person = new object();

set(person);

alert(person.name);//"nico"

以上**建立了乙個person物件,然後變數被傳遞到set()中被複製給了obj,因為指向的同乙個物件,隨意當函式累不新增屬性後,會被反映到全劇中。然後很多人錯誤的認為:在區域性作用域修改的物件會在全域性作用域反映出來,就說明是按引用傳遞的,證明如下例:

function set(obj)

let person = new object();

set(person);

alert(person.name);//"nico"

在給obj複製nico後,又為obj建立了乙個新物件,同時屬性設定為ni。如果person是按引用傳遞的,那麼person的屬性值應該為ni的新物件,然而並不是,說明即使在函式內部修改了引數的的值,但原始的引用仍然不會變,實際上,當函式內部重寫obj時,這個變數引用的就是乙個區域性物件了。而這個區域性物件會在函式執行完畢後被立即銷毀。

JavaScript高階程式設計

ecmascript有5種基本型別資料 另外還有一種複雜的資料型別 typeof就是用來檢測變數的資料型別的,typeof可能會返回以下值 typeof操作符在檢測引用型別的值時,總是會返回object,所以用處不大。instanceof用來檢測物件型別的,返回值是 true false。例如 pe...

JavaScript高階程式設計 this

在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了 因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件...

javascript 高階程式設計 二

這裡我們直接進入主題 在js剛剛開始的時候,必須面臨乙個問題,那就是如何使的js的載入和執行不會影響web核心語言html的展示效果,和html和諧共存。在這個背景下 2 xhtml中的應用 在html中如果字串,那麼html就會認為js指令碼已經結束所以會產生乙個錯誤用一下 來替換 來替換aler...