首頁 web前端 js教程 理解js回收機制簡單易懂版_javascript技巧

理解js回收機制簡單易懂版_javascript技巧

May 16, 2016 pm 03:13 PM
js 回收機制

之前文章中,講解過js中的回收機制,但是對於當時的我來說,我自己對回收機制的這個概念也有些懵懵懂懂,現在對回收機制有了更深入的理解,所以特此發佈此文給於總結,也好加深記憶。
為什麼要有回收機制? why?

打個比方,我有一個內存卡,這個內存是8G的,我把文件,視頻,音樂,都保存到了這個內存卡,隨著我的儲存的內容越來越多,這個內存卡已經保存不了了,如果我還想再把其他的文件保存到這個內存卡就需要刪除一些文件,但是這些被刪除的文件是我們自己手動刪除的對吧,手動刪除就相當於js中的delete。

在這些程式語言中同樣也會出現這些問題,對,記憶體!我們聲明的任何變數都需要消耗內存,這些變數越多運行的速度也會越慢。當然不只是變量,程式碼中的任何東西。這些語言的設計者為了解決這些問題,設計了一套程式碼的回收規則。

程式碼回收規則如下:

    1.全域變數不會被回收。

    2.局部變數會被回收,也就是函數一旦運行完以後,函數內部的東西都會被銷毀。

    3.只要被另外一個作用域所引用就不會被回收

我用幾個例子來證明這些。

function a(){
 var user = "追梦子";
 return user;
}
var b = a();
console.log(b); //追梦子 
登入後複製

  照理說我是不能存取函數a裡面的變數的,但是我透過全域變數b接收了這個函數a return過後的值,於是最後這段程式碼就成了下面這樣。

function a(){
 var user = "追梦子";
 return user;
}
var b = "追梦子";
console.log(b);
登入後複製

好像這看不出什麼程式碼回收,那我們來看接下來的一段程式碼。

function a(){
 var num = 0;
 return function(){
  num ++;
  console.log(num);
 };
}
var b = a();
b(); //1
b(); //2
b(); //3
登入後複製

  看到了吧,如果按照正常的做法,那麼輸出的應該是3次1次對,因為函數體一旦運行那麼這個函數體內的程式碼就會被清空,既然會被清空那麼下次運行這段程式碼的時候num應該還是1,但這裡情況有些不同,我上面說過函數中的局部變數只要被另外一個作用域所引用那麼這段程式碼就不會被銷毀。

  上面的程式碼就像這樣

function a(){
 var num = 0;
 return function(){
  num ++;
  console.log(num);
 };
}
var b = function(){
  num ++;
  console.log(num);
 };
b();
b();
b();
登入後複製

那麼被函數a回傳的那個匿名函數的作用域由函數a轉向了window,由於這個匿名函數被全域變數b引用所以不會被銷毀。

function a(){
 var num = 0;
 return function(){
  num ++;
  console.log(num);
 };
}
var b = {
 fn:a()
}
b.fn(); //1
b.fn(); //2
b.fn(); //3
登入後複製

同樣可以,因為匿名函數被物件b的屬性fn引用,改變了它的作用域,簡單來說只要一個函數或局部變數被改變作用域那麼這個函數或是局部變數就不會被銷毀。
以上就是本文的全部內容,希望大家對js回收機制有幫助。

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

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用JS和百度地圖實現地圖平移功能 如何使用JS和百度地圖實現地圖平移功能 Nov 21, 2023 am 10:00 AM

如何使用JS和百度地圖實現地圖平移功能

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 Dec 17, 2023 pm 06:55 PM

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

建議:優秀JS開源人臉偵測辨識項目

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 Dec 18, 2023 pm 03:39 PM

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法

如何使用PHP和JS創建股票蠟燭圖 如何使用PHP和JS創建股票蠟燭圖 Dec 17, 2023 am 08:08 AM

如何使用PHP和JS創建股票蠟燭圖

如何使用JS和百度地圖實現地圖多邊形繪製功能 如何使用JS和百度地圖實現地圖多邊形繪製功能 Nov 21, 2023 am 10:53 AM

如何使用JS和百度地圖實現地圖多邊形繪製功能

如何使用JS和百度地圖實現地圖點擊事件處理功能 如何使用JS和百度地圖實現地圖點擊事件處理功能 Nov 21, 2023 am 11:11 AM

如何使用JS和百度地圖實現地圖點擊事件處理功能

如何使用JS和百度地圖實現地圖熱力圖功能 如何使用JS和百度地圖實現地圖熱力圖功能 Nov 21, 2023 am 09:33 AM

如何使用JS和百度地圖實現地圖熱力圖功能

See all articles