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...