什麼是按值傳遞呢? 把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。php
舉個簡單的例子:bash
示例一:js代碼按值傳遞
若是按引用傳遞,那麼函數裏面的num會變成相似全局變量,最後輸出60
function box(num){ // 按值傳遞
num+=10;
return num;
}
var num=50;
console.log(box(num)); // 60
console.log(num); // 50
複製代碼
當傳遞 num
到函數 box 中,至關於拷貝了一份 num
,假設拷貝的這份叫 num
,函數中修改的都是 num
的值,而不會影響原來的 num
值。數據結構
示例二:php代碼傳遞一個參數:
function box(&$num){
//加上&符號將num變成全局變量
$num+=10;
return $num;
}
$num = 50;
echo box($num); // 60
echo $num; // 60
複製代碼
在 php 中的引用傳遞,會改變外部的 num
值,最後 num
也會輸出60。閉包
拷貝雖然很好理解,可是當值是一個是對象這種複雜的數據結構的時候,拷貝就會產生性能問題。函數
因此還有另外一種傳遞方式叫作按引用傳遞。post
所謂按引用傳遞,就是傳遞對象的引用,函數內部對參數的任何改變都會影響該原對象的值,由於二者引用的是同一個對象。性能
舉個例子:ui
function box(o){ // 按對象傳遞
o.num = 10;
return obj.num;
}
var obj = { num: 50 };
console.log(box(obj)); // 10
console.log(obj.num); // 10
複製代碼
ECMAScript標準中全部函數的參數都是按值傳遞的,會出現引用傳遞,而這到底是不是引用傳遞呢?spa
讓咱們再看個例子:code
function box(o){ // 按對象傳遞
o = 10;
return o;
}
var obj = { num: 50 };
console.log(box(obj)); // 10
console.log(obj.num); // 50
複製代碼
若是 JavaScript 採用的是引用傳遞,外層的值也會被修改吶,這怎麼又沒被改呢?因此真的不是引用傳遞嗎?
這就要講到其實還有第三種傳遞方式,叫按共享傳遞
。
而共享傳遞是指,在傳遞對象的時候,傳遞對象的引用的副本。
因此修改 o.num
,能夠經過引用找到原值,可是直接修改 o
,並不會修改原值。因此第二個和第三個例子其實都是按共享傳遞
。
咱們能夠理解,參數若是是基本類型是按值傳遞,若是是引用類型,也就是傳遞的是一個對象的引用,按共享傳遞。
新手寫做,若是有錯誤或者不嚴謹的地方,請大夥給予指正。若是這片文章對你有所幫助或者有所啓發,還請給一個贊,鼓勵一下做者,在此謝過。