JavaScript之變數 作用域

2021-09-23 21:35:35 字數 1200 閱讀 7855

一.變數

1.基本型別值和引用型別值

js和其他語言一樣也分值型別和引用型別。在基本概念那篇部落格也紀錄了五種常見的基本資料型別:undefined、null、boolean、number、string。這五種都是按值訪問的基本資料型別,可以操作保持在變數中的實際的值.(js和其他語言c#不同的是string也是基本資料型別)。

引用型別的值是儲存在記憶體中的物件。js不允許直接訪問記憶體中的物件,不能直接操作物件的記憶體空間。操作物件是是操作的物件的引用。對於引用型別的值可以為它動態的新增屬性。

2.變數值的拷貝

這個和c#的類似,基本資料型別是直接建立乙個新的變數,對於引用型別是將變數指向賦值物件的堆位址。

3.傳遞引數

js中所有的函式的引數都是按值傳遞。把函式外部的值複製給函式內部的引數。傳遞引數和變數值拷貝一樣。在向函式傳遞引用型別的值時,會把這個值在記憶體中的位址複製給乙個區域性變數,這個區域性變數的變化會反映在函式外部(類似c#)。

4.檢測型別

要檢測乙個基本型別的變數用typeof是極好的,但對於乙個物件或null,用type始終返回object,這樣就不是極好的了。這時候instanceof出場了。有了它可以檢測出它是什麼型別的物件,是陣列、還是正則等。

二、執行環境和作用域

1. 執行環境定義了變數或函式有權訪問的其他資料。每個執行環境都有乙個與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。

全域性執行環境是最外圍的乙個執行環境。宿主不同所表示的執行環境的物件也不一樣。在web瀏覽器中,全域性執行環境被認為是window物件。

每個函式都有自己的執行環境。當執行流進入乙個函式時,函式的環境就被推入乙個環境棧中,當函式執行之後,棧將其彈出,把控制權交給之前的執行環境。

作用域鏈書上介紹的有點過於仔細,意思和生命週期差不多,就是看你這個變數能被訪問的地方。

用try-catch、with來延長作用域鏈。

2.js沒有塊級作用域

看到上面**測試可能做過c#這些的會感到奇怪,包括我。其實在js中一點也不奇怪。在js中是沒有塊級作用域。用var宣告的變數會新增到最近的環境中,在函式內部,最接近的的環境是函式的區域性環境,在with語句中,最接近的環境是函式環境。如果未使用var宣告,變數會自動新增到全域性變數中。

JavaScript深入之變數物件

作用域鏈 scope chain this instanceof object console.log math.random console.log this.math.random 1 console.log this.a 1 console.log window.a this.window.b...

c 之變數作用域

作用域是程式的乙個區域,一般來說有三個地方可以定義變數 我們將在後續的章節中學習什麼是函式和引數。本章我們先來講解宣告是區域性變數和全域性變數。在函式或乙個 塊內部宣告的變數,稱為區域性變數。它們只能被函式內部或者 塊內部的語句使用。下面的例項使用了區域性變數 include iostream us...

Python之變數作用域

coding utf 8 file 變數作用域.py author date 2019 12 23 desc 變數的作用域決定了程式的哪一部分可以訪問哪個特定的變數名稱。python的作用域一共有4層,分別是 l local 區域性作用域 e enclosing 閉包函式外的函式中 g global...