javaScript入門2--變數,作用域,記憶體

来源:http://www.cnblogs.com/yuzheCyril/archive/2016/04/28/5442199.html
-Advertisement-
Play Games

變數類型:基本類型和引用類型 基本類型上節已經提到。基本類型的值是按值傳遞的,既改變形參的值不會影響實參 其中,a(x)為100 ,alert(x)為1 可見js的基本類型是按值傳遞的 引用類型:由多個值構成的對象,是按照共用傳遞的,也就是對象屬性的形參的改變會影響對象屬型的改變,對象形參的改變不會 ...


變數類型:基本類型和引用類型

      基本類型上節已經提到。基本類型的值是按值傳遞的,既改變形參的值不會影響實參

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        var x=1;
        function a(o){
            o=100;
            alert(o);
        }
        a(x);
        alert(x);
    </script>
</body>
</html>

其中,a(x)為100  ,alert(x)為1  可見js的基本類型是按值傳遞的

      引用類型:由多個值構成的對象,是按照共用傳遞的,也就是對象屬性的形參的改變會影響對象屬型的改變,對象形參的改變不會影響對象的改變。

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
<script>
    var obj={x:1};
    function a(){
        arguments[0].x=2;
    }
        
    a(obj);
    alert(obj.x);
</script>
</body>

</html>

 可見alert(obj.x)為2  由此知對象屬性的形參的改變會使對象的屬性改變

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
<script>
    var obj={x:1};
    function a(){
        arguments[0]=2;
    }
        
    a(obj);
    alert(obj.x);
</script>
</body>

</html>

alert(obj.x)為1  可見對象的形參的改變不會影響對象

  還有一點要註意的是,JavaScript有聲明提前的特性,也就是說你可以先調用一個變數,然後聲明,但是變數的賦值是不會提前的。

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
<script>
    alert( a);
    var a=1;
</script>
</body>

</html>

此時alert返回的結果是undefined ,可見a確實聲明瞭

    在變數的複製過程中,按值傳遞與按共用傳遞也是不同,對於按值傳遞 在string基本類型中,每一次對字元串的修改操作,實際都是新建了一個變數。

var a=1;
var b=a;

其過程是a,b是完全獨立的,這兩個值參與的任何操作不會互相影響

    按共用傳遞

var obj1={x:1};
var obj2=obj1;
obj2.x=2;
alert(obj1.x);

此時,alert輸出的值也為2,可見屬性的改變時會相互影響的,但對象之間互不影響。

  instancof操作符   用於檢查對象的類型,如Array,RegExp  用法實例:alert(colors instanceof Array); 其返回值為boolean

 作用域

  (執行)環境:js的最重要的概念。每個執行環境都有一個關聯的變數對象,改環境中的變數和函數都保存在這個變數對象中,解釋器在後臺會使用它。

   全局執行環境的變數對象是window,那麼這個window對象就保存著全局變數和函數。

  每一個函數都有一個執行環境,可以理解為局部環境,但執行流到達函數時,環境會置於一個環境棧中,當執行完畢後,環境棧會把這個函數環境彈出,繼續執行下一個環境。

  當一個環境遇到執行流時,會創建變數對象的一個作用域鏈,改作用域鏈的前端為當前的變數對象,如這個環境是函數,那麼這個變數對象又稱為活動對象,這個對象做開始只包含一個arguments變數。作用域鏈的下一個變數對象是包含環境,在下一個亦是上一個的包含環境,所以,作用域鏈的末尾的變數對象永遠都是window(全局執行環境的變數對象),那麼,內部環境可以通過作用域鏈訪問外部環境,外部環境則不能。

  也就是說,var聲明的變數會被自動添加到離他最近的環境中(向上),在函數內部,就是該函數的環境,在with中,也是相應的環境。

  那麼,可以通過with或者try--catch來演唱作用域鏈,即在作用域鏈的前端增加一個變數對象。如下

function a(){
var a=true;
with(location){
 var url=href+a;
}
return url;
}
a();

  需要註意一點,js沒有塊級作用域

  變數查詢(查詢標識符)當某個環境為了讀取或者引用一個標識符時,就要進行檢索過程,搜索過程從作用域鏈的前端開始,向上逐級查詢,遇到匹配的就停止。

垃圾收集:js具有自動清除垃圾的能力,切這個功能是迴圈進行的(時間間隔),垃圾清理主要是為了減少記憶體的浪費,對不再使用的變數進行銷毀,釋放記憶體。

    1.標記清除法:js既然要自動清除垃圾,那麼就要知道哪些是需要清理的,哪些是需要保留的,最簡單的方法便是mark,當執行流執行到一個變數時,這個變數會被標記為“進入環境”,當執行結束後,便會被標記“離開環境”,當然標記的方法是多種多樣的,可以是位翻轉或者列表,這也是標記清除的思想。在標記清除中,垃圾收集器在運行時會對所有記憶體中的變數都加上標記,然後,他會去掉環境中的變數以及被環境中的變數引用的變數的標記,在此之後,在為這些變數添加標記,這些變數將被視為要刪除的變數,最後完成記憶體清除操作。

    2.引用計數:跟蹤記錄每個值得引用次數,每被變數引用一次,就加1,若變數去了其他的值,就-1,直到為0,進行清除。這回倒著一個迴圈引用問題的出現,導致記憶體的浪費。

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目前前端框架太多,接觸過angular、ember,現在開始倒騰vue 此處用到v-if、v-else、v-show,v-if或讓元素不在DOM上,v-show只是改變display:block屬性,感覺v-if好 感覺跟適合、 演示效果:http://wjf444128852.github.io/ ...
  • × 目錄 [1]水平對齊+行高 [2]水平+垂直對齊 [3]margin+垂直對齊[4]absolute[5]flex 前面的話 水平居中和垂直居中已經單獨介紹過,本文將介紹水平垂直同時居中的5種思路 思路一: text-align + line-height實現單行文本水平垂直居中 思路二: te ...
  • 承接上一篇:【CSS3進階】酷炫的3D旋轉透視 。 最近入坑 Web 動畫,所以把自己的學習過程記錄一下分享給大家。 CSS3 3D 行星運轉 demo 頁面請戳:Demo。(建議使用Chrome打開) 本文完整的代碼,以及更多的 CSS3 效果,在我 Github 上可以看到,也希望大家可以點個 ...
  • 1、在進行JS記憶體泄露檢查之前,先要瞭解JS的記憶體管理: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management 2、學習使用Chrome Profile進行性能調優、記憶體分析: http://blog.jo ...
  • 屬性關聯特定類、結構或枚舉的值,存儲屬性將存儲常量和變數作為實例的一部分,計算屬性用於計算一個值,而不進行存儲。計算屬性可以用於類、結構體和枚舉里,存儲屬性只能用於類和結構體。存儲屬性和計算屬性通常用於特定類型的實例,但是,屬性也可以直接用於類型本身,這種屬性稱為類型屬性。另外,還可以定義屬性監視器 ...
  • 自定義tableViewCell 1、獨立使用xib創建的cell不需要使用:註冊cell,不然會使用不了,如下代碼 [self.tableView registerClass:[ableViewCell class] forCellReuseIdentifier:@“actionCell"]; 問 ...
  • 怎樣在代碼文件中修改控制項的高低 有些時候使用setHight()或者setWidth()不管用就需要使用別的方法,下麵有一種方法 你使用的佈局.LayoutParams lp = new 你使用的佈局.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutPar ...
  • 1.前言: 今天再一次去蹭了一下某老師的android課,這一次講的是Android的SQLite的使用,老師當場講解了他自己做的例子。 回來之後,我春心萌動,不得不拿著參考資料再做了一個類似的例子,其實我已經過幾遍SQLite的內容了,但是認識還是不深刻。 2.SQLite繼承 要想使用SQLit ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...