Javascript中的作用域

2021-09-18 02:24:33 字數 1369 閱讀 6251

所謂作用域,作用就是指讀,寫等操作,而域便是指空間,範圍等

js中的域有

1.script

script是全域性的域,相應地裡面的變數就是全域性變數,函式就是全域性函式,如果有多個script包住的域的話,

函式會自上而下執行,比如寫了兩的時候便會從上到下先執行第乙個script再執行第二個

script的**

比如下面這個例子

//會報undefined的錯,在每乙個域中都會完成兩步操作,預解析和逐行解讀**,在第乙個域中,預解析完了之

//後倉庫(比喻,後文會提到)裡並沒有a這個變數,所以執行alert的時候會報錯// 可以正常工作,因為在第乙個預解析的過程中,變數a已經被存入了倉庫中,在第二個script域裡面並不會清空

//之前倉庫裡的變數

2.函式
函式內部也有乙個域,域的執行方向為由裡到外,比如在函式裡面alert(a),如果在裡面沒有定義這個a的話,

那麼它便會向外一級去尋找這個變數a,一層一層,直到找到為止,如果找不到就會報錯

談到這裡,大家對上面最不明白的應該就是那個倉庫了,下面來詳細談談

首先要了解得應該是下面這個

js解析器並不會在一開始執行所有**,而是會先進行乙個預解析,預解析的時候只是根據一些關鍵字來找到一些東西放到「倉庫」裡面去,如果是var 變數,不會管變數是乙個什麼值,直接先給它賦乙個值undefined,如果是乙個函式function,會把整個**塊賦值給它(這個**塊並不會執行),而如果是乙個引數的話,相當於var 引數(參考變數);

1. 預解析,「找一些東西,根據一些關鍵字,var function 引數」

在找的過程中

所有的變數,在正式執行**之前,都被賦了乙個值,undefine

所有的函式,在正式執行之前,都是整個函式塊

所有的引數,(a)相當於(var a;)

但是如果因為開發者的不留心,這些變數名和函式名互相之間衝突了,倉庫裡的東西會怎麼樣呢,

答案是遇到重名的,只留乙個,函式和變數重名了,留函式,同一級別的重名了,留後面那乙個
2. 逐行解讀**

當預解析完成之後,便相當於開始正式工作了,之前的相當於熱身

解讀**的過程中,表示式是可以改變「倉庫」裡的值的,而函式呼叫也就是相當於在函式裡面那個域裡面再執行預解析和逐行解讀**的操作

表示式 = + - * / % ++ -- ! number()...... 表示式可以去改預解析中的值

函式呼叫

1.預解析

2.逐行解讀**

有時間放幾個小例子來幫助更好的理解,先寫到這吧。

Javascript的作用域域作用域鏈的理解

如何解析一段可執行 分了兩個階段 解析 和執行 其中解析 可以理解為記名字,就是先把關鍵字var和function定義的變數名登記了下來,這也就有了變數提公升這一說。在執行 階段才是真正的執行賦值,運算等操作。暫不解析這幾個名詞,先來看乙個例子。var scope global function f...

JavaScript 作用域,作用域鏈詳解

前言 es5缺少區域性作用域的概念,而es6已經補充了es6的概念。一 作用域 把作用域比作乙個個封閉的方塊,在相同乙個封閉方塊中的物體可以相互接觸,但是無法和別的封閉方塊中的物體直接接觸。二 全域性作用域 這個就是簡單的全域性作用域。全域性作用域相當於乙個最大的封閉空間,他裡面還有乙個個小的封閉空...

Javascript變數作用域

1.變數作用域是什麼鬼?2.全域性變數 全域性變數擁有全域性作用域 作用範圍在整個頁面中 在 的任何地方都有定義。擁有全域性作用域的情形 1 宣告在函式外部的變數。eg var a 全域性變數 function b 2 宣告變數時,缺少關鍵字var。eg function b 函式引數的變數 fun...