ECMAScript 變量:
1.基本類型值(簡單數據段)
2.引用類型值(可能由過個值構成的對象) → 保存在內存中的對象
------
動態屬性: 只能給引用型值動態添加新屬性,以便將來使用。
------
復制變量值 :
基本類型值的復制 → 在變量對象上創建一個新值 → 復制給新變量(互不影響)
引用類型值的復制 → 將存儲在變量對象中的值復制到新變量分配空間中(復制的是一個指針,指向同一個對象,相互影響)
------
傳遞參數:
ECMAScript中所有函數的參數都是按值傳遞 。
(函數外部的值復制給函數內部的參數。
→ 可以把ECMA函數的參數想象成局部變量。)
原因解釋:
說法一:
函數參數是一種局部變量,在外部值傳遞給函數參數,內部外部互不影,引用傳遞復制的是地址,所以他內務外部相互有影響。
說法二:對象角度(參數是一個對象 obj)
------
對象按值傳遞 → 參數對象和外部對象引用同一個對象 → 外部對象指向的對象在堆內存中只有一個,且是全局變量。
不要錯認為是在局部作用在修改的對象在全局作用域(外部)反映出來的結果 → 函數內部的局部變量在函數執行完會立即銷毀。
------
執行環境(有時候也簡稱“環境”)及作用域
執行環境定義了白嬢或函數有權訪問其他數據決定了他們各自的行為 → 每個執行環境都有一個與之關聯的變量對象 → 環境中定義的所有變量和函數都保存在這個對象。
------
每個函數都有自己的執行環境 → 當執行流進入一個函數時 → 函數環境會被推入一個環境棧中 → 在函數執行後將其彈出 → 把控制權返回給之前的執行環境
代碼在一個環境執行中時,會創建變量對象的一個作用域鏈(scope chain)
作用域鏈用途:保證對執行環境有權訪問的所有變量和函數的有序訪問。
作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象
------
內部環境可以通過作用域鏈所有的外部環境,但是外部環境不能訪問內部環境(環境的聯系是線性的,有次序的 → 向上搜索作用域鏈以查詢變量和函數名)
函數參數也被當做變量來對待
------
延長作用域鏈:
有些語句可以在作用域的前端鏈臨時增加一個變量(變量在代碼執行後移除)
1.try-catch語句的catch塊
2.with語句
------
Javas沒有塊級作用域
這裡可以再簡單區分一下塊級作用域和函數作用域
以上這篇關於JS變量和作用域詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。