日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
JavaScript變量、作用域及內存詳解

基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內存中占有固定的大小空間,他們的值保存在??臻g,我們通過按值來訪問的。

(1)值類型:數值、布爾值、null、undefined。
(2)引用類型:對象、數組、函數。

如果賦值的是引用類型的值,則必須在堆內存中為這個值分配空間。由于這種值的大小不固定(對象有很多屬性和方法),因此不能把他們保存到棧內存中。但內存地址大小是固定的,因此可以將內存地址保存在棧內存中。

簡而言之,堆內存存放引用值,棧內存存放固定類型值。“引用”是一個指向對象實際位置的指針。

在這里需注意的是,引用指向的是具體的對象,而不是另一個引用。

這里的對象可以是字符串對象,數字對象,數組對象等

 
 
  1.  

復制變量值

再看下面這個例子:

 
 
  1.  

由以上可以得出:在變量復制方面,基本類型和引用類型也有所不同,基本類型復制的是值本身,而引用類型復制的是地址。

傳遞參數

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

 
 
  1.  

js沒有按引用傳遞的,如果存在引用傳遞的話,那么函數內的變量將是全局變量,在外部也可以訪問。但這明顯是不可能的。

執(zhí)行環(huán)境及作用域

執(zhí)行環(huán)境是javascript中最為重要的概念之一,執(zhí)行環(huán)境定義了變量或函數有權訪問其他數據。

全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境,在web瀏覽器中,全局執(zhí)行環(huán)境是window對象,因此,所有的全局變量的函數都是作為window的屬性和方法創(chuàng)建的。

 
 
  1.  

當執(zhí)行環(huán)境內的代碼執(zhí)行完畢后,該環(huán)境被銷毀,保存其中的變量和函數也隨之銷毀,如果是全局環(huán)境,需所有程序執(zhí)行完畢或網頁完畢后才會銷毀。

去掉var的局部變量

 
 
  1.  

通過傳參,也是局部變量

 
 
  1.  

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

 
 
  1.  

可以通過如下方法進行訪問:

 
 
  1.  

再一個作用域例子:

 
 
  1.  

當代碼在一個環(huán)境中執(zhí)行的時候,就會形成一種叫做作用域鏈的東西,它的用途是保證對執(zhí)行環(huán)境中有訪問權限的變量和函數進行有序訪問(指按照規(guī)則層次來訪問),作用域鏈的前端,就是執(zhí)行環(huán)境的變量對象。

作用域

變量沒有在函數內聲明或者聲明的時候沒有帶var就是全局變量,擁有全局作用域,window對象的所有屬性擁有全局作用域;在代碼任何地方都可以訪問,函數內部聲明并且以var修飾的變量就是局部變量,只能在函數體內使用,函數的參數雖然沒有使用var但仍然是局部變量。

沒有塊級作用域

 
 
  1. // if語句: 
  2.  
  3.  

for循環(huán)語句也是如此。

變量的查詢

在變量的查詢中,訪問局部變量要比全局變量來得快,因此不需要向上搜索作用域鏈。

如下例子:

 
 
  1.  

每個環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數名;但任何環(huán)境都不能通過向下搜索作用域鏈而進入另一個執(zhí)行環(huán)境。在這里,如果去掉var name = "trigkit4",那么將彈出“Jack”

內存問題

javascript具有自動垃圾回收機制,一旦數據不再使用,可以將其設為”null”來釋放引用

循環(huán)引用

一個很簡單的例子:一個DOM對象被一個Javascript對象引用,與此同時又引用同一個或其它的Javascript對象,這個DOM對象可能會引發(fā)內存泄露。這個DOM對象的引用將不會在腳本停止的時候被垃圾回收器回收。要想破壞循環(huán)引用,引用DOM元素的對象或DOM對象的引用需要被賦值為null。

閉包

在閉包中引入閉包外部的變量時,當閉包結束時此對象無法被垃圾回收(GC)。

var a = function() {
  var largeStr = new Array(1000000).join('x');
  return function() {
    return largeStr;
  }
}();

DOM泄露

當原有的COM被移除時,子結點引用沒有被移除則無法回收。

var select = document.querySelector;
var treeRef = select('#tree');

//在COM樹中l(wèi)eafRef是treeFre的一個子結點
var leafRef = select('#leaf');
var body = select('body');

body.removeChild(treeRef);

//#tree不能被回收入,因為treeRef還在
//解決方法:
treeRef = null;

//tree還不能被回收,因為葉子結果leafRef還在
leafRef = null;

//現在#tree可以被釋放了。

Timers計(定)時器泄露

定時器也是常見產生內存泄露的地方:

 
 
  1. for (var i = 0; i < 90000; i++) { 
  2.   var buggyObject = { 
  3.     callAgain: function() { 
  4.       var ref = this; 
  5.       var val = setTimeout(function() { 
  6.         ref.callAgain(); 
  7.       }, 90000); 
  8.     } 
  9.   } 
  10.  
  11.   buggyObject.callAgain(); 
  12.   //雖然你想回收但是timer還在 
  13.   buggyObject = null; 

調試內存

Chrome自帶的內存調試工具可以很方便地查看內存使用情況和內存泄露,在 Timeline -> Memory 點擊record即可。


網頁題目:JavaScript變量、作用域及內存詳解
轉載源于:http://www.dlmjj.cn/article/dhjoiph.html