首頁 >web前端 >js教程 >如何理解javascript中的類型、傳參與執行環境

如何理解javascript中的類型、傳參與執行環境

伊谢尔伦
伊谢尔伦原創
2017-07-18 10:36:261346瀏覽

基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在記憶體中佔有固定的大小空間,他們的值保存在堆疊空間,我們透過按值來存取的。

(1)值類型:數值、布林值、null、undefined。
(2)引用類型:物件、陣​​列、函數。

如果賦值的是引用型別的值,則必須在堆記憶體中為這個值分配空間。由於這種值的大小不固定(物件有很多屬性和方法),因此不能把他們保存到堆疊記憶體中。但記憶體位址大小是固定的,因此可以將記憶體位址保存在堆疊記憶體中。

<script type="text/javascript”>
var box = new Object(); //创建一个引用类型
var box = "lee";  //基本类型值是字符串
box.age = 23;  //基本类型值添加属性很怪异,因为只有对象才可以添加属性。
alert(box.age); //不是引用类型,无法输出;
</script>

簡而言之,堆疊記憶體存放參考值,堆疊記憶體存放固定型別值。

<script type="text/javascript">
  var man = new Object();//man指向了栈内存的空间地址
  man.name = "Jack";
  var man2 = man;//man2获得了man的指向地址

  alert(man2.name);//两个都弹出Jack
  alert(man.name);
</script>

複製變數值

再看下面這個例子:

<script type="text/javascript">
  var man = new Object();//man指向了栈内存的空间地址
  man.name = "Jack";
  var man2 = man;//man2获得了man的指向地址

  man2.name = "ming";//因为他们都指向同一个object,同一个name,不管修改谁,大家都修改了
  alert(man2.name);//两个都弹出ming
  alert(man.name);
</script>

由以上可以得到:在變數複製方面,基本類型和引用類型也有所不同,基本型別複製的是值本身,而引用型別複製的是位址。

傳遞參數

ECMAScript中,所有函數的參數都是按值傳遞的,

<script type="text/javascript">
   function box(num){   //按值传递
     num+=10;
     return num;
   }

   var num = 10;
   var result = box(num);
   alert(result); //如果是按引用传递,那么函数里的num会成为类似全局变量,把外面的number替换掉
   alert(num);  //也就是说,最后应该输出20(这里输出10)
</script>

javascript沒有按引用傳遞的,如果存在引用傳遞的話,那麼函數內的變數將是全域變量,在外部也可以存取。但這明顯是不可能的。

執行環境

執行環境是javascript中最重要的概念之一,執行環境定義了變數或函數有權存取其他資料。

全域執行環境是最外圍的執行環境,在web瀏覽器中,全域執行環境是window對象,因此,所有的全域變數的函數都是作為window的屬性和方法創建的。


<script type="text/javascript">
   var name = "Jack";      //定义全局变量
   function setName(){
     return "trigkit4";
   }

   alert(window.name);    //全局变量,最外围,属于window属性
   alert(window.setName()); //全局函数,最外围,属于window方法
</script>

當執行環境內的程式碼執行完畢後,該環境被銷毀,保存其中的變數和函數也隨之銷毀,如果是全域環境,需所有程序執行完畢或網頁完畢後才會銷毀。

去掉var的局部變數

<script type="text/javascript">
   var name = "Jack";
   function setName(){
     name = "trigkit4";  //去掉var变成了全局变量
   }

   setName();
   alert(name);//弹出trigkit4
</script>

透過傳參,也是局部變數

<script type="text/javascript">
   var name = "Jack";
   function setName(name){  //通过传参,也是局部变量
     alert(name);
   }

   setName("trigkit4");//弹出trigkit4
   alert(name);//弹出Jack
</script>

函數體內還包含函數,只有這個函數才可以訪問內一層的函數

<script type="text/javascript">
   var name = "Jack";
   function setName(){
     function setYear(){  //setYear()方法的作用域在setName()内
       return 21;
     }
   }
   alert(setYear());//无法访问,出错 
</script>

可以透過以下方法存取:

<script type="text/javascript">
   var name = "Jack";
   function setName(){
     function setYear(){  //setYear()方法的作用域在setName()内
       return 21;
     }
     return setYear();
   }
   alert(setName()); //弹出21
</script>

以上是如何理解javascript中的類型、傳參與執行環境的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn