JavaScript基礎專題之參數傳遞(五)

按值傳遞

什麼是按值傳遞呢? 把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。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,並不會修改原值。因此第二個和第三個例子其實都是按共享傳遞

總結

咱們能夠理解,參數若是是基本類型是按值傳遞,若是是引用類型,也就是傳遞的是一個對象的引用,按共享傳遞。

JavaScript基礎專題系列

JavaScript基礎專題之原型與原型鏈(一)

JavaScript基礎專題之執行上下文和執行棧(二)

JavaScript基礎專題之深刻執行上下文(三)

JavaScript基礎專題之閉包(四)

新手寫做,若是有錯誤或者不嚴謹的地方,請大夥給予指正。若是這片文章對你有所幫助或者有所啓發,還請給一個贊,鼓勵一下做者,在此謝過。

相關文章
相關標籤/搜索