筆記:js參數傳遞問題

前言

var a = [1],b=[1];
a==b;     //fasle
var c = b;
c[0]=2;
b         //[2]
c = [3];
b         //[2]

解釋:b對c說,我贊成你跟我共用一個內存地址,你能夠在個人內存地址內,修改局部成員,可是你要連個人家都給挪走,對不起 你本身走。。。微信

正題

ECMAScript 中全部函數的參數都是按值傳遞的。訪問變量有按值和按引用兩種方式,而參數只能按值傳遞。
  函數

基本類型參數傳遞:傳給函數的是數值的一個複製,函數中對其的修改外部不可見。spa

var a = 1;
var b = 2;
function change(a, b) {
    var c = a;
    a = b;
    b = c;
    console.log(a);    //2
    console.log(b);    //1
}
change(a, b);
console.log(a);    //1
console.log(b);    //2

引用類型參數傳遞:傳給函數的是數值的一個引用,函數中對其屬性的修改外部可見,但用新引用覆蓋其則在外部不可見code

var a = [1, 2, 3];
var b = [5, 6];
function change(a,b) {
  a[0] = 4;    //對其屬性的修改外部可見 
  var c = a;
  a = b;      //用新引用覆蓋
  b = c;
  console.log(a);  //"5,6"        
  console.log(b);  //"4,2,3"
}
change(a,b);
console.log(a);    //"4,2,3"
console.log(b);    //"5,6"

  a,b是change函數中的變量,在調用函數時傳遞了a,b的引用賦給了這兩個變量,可是並不能改變全局中的a,b。由於用新引用覆蓋在外部不可見,由於函數只是拿到了引用 並無權力更改引用。圖片

var a = [1, 2, 3];
var b = [5, 6];
function change() {
  var c = a;
  a[0] = 4;    //對其屬性的修改外部可見 
  a = b;      //用新引用覆蓋
  b = c;
}
change(a,b);
console.log(a);  //"5,6" 
console.log(b);  //"4,2,3"

  由於js沒有塊級做用域,因此它在change裏找不到變量a,b就會自覺的到上層去找,因此這裏的a,b是全局變量的引用。
歡迎搜索微信公衆號:一線碼農
或掃碼關注:
圖片描述ip

相關文章
相關標籤/搜索