JS作用域及變數的認識

2021-07-24 17:06:11 字數 1611 閱讀 7787

js一直以來可謂是前端技術中一大難關,學也容易,但想學的有深度可謂是十年磨一劍,有點兒誇張了。總之,非一朝一夕之就,多研究研究,多問問為什麼,就ok。

對於js入手並不是很長的發燒友來說,一些基礎還是有必要弄得紮實。

js作用域,作用域的理解可以讓我們更好的去做到變數的公有和變數的私有化。

主要就寫一些容易出現知識上虧欠的理解。

1.預解析

在**執行前,計算機會分配空前來存貯變數。並不是一開始就把所有變數就儲存起來,實際上那些公用的變數才會被存貯起來,也就所謂的全域性變數。而全域性變數它在**的任何地方都是存在的,你可以在任何位置去呼叫,不過受到作用域的限制,會有層級的去查詢,當然也就從自身的作用域一層層往外找,也就有著就近原則。

所謂的預解析,就是在**執行之前,它會分配乙個記憶體空間給變數,但是並沒有賦值,而賦值是發生在**執行的過程中的, 

比方說:   

**段1: console.log(a)        ----------------------------》undefined;

var a=123;

這段**的程式處理是這樣的,一開始發生預解析:var a ;     然後預解析完畢,此時a並沒有賦值.執行整段**,  console.log(a)自然就是undefined,接著var a=123,才開始賦值;

2.如果是乙個普通函式,也是如此;

比方說,function a(){};

預解析發生時,儲存的是乙個位址,它指向這個函式,其實跟上面也很類似;

3.函式的呼叫,是在自身的作用域,而不是呼叫它的作用域,比方說閉包;

function a();

情況一;自我呼叫 -------------

fn();   

這個並沒有任何人去呼叫,但是fn是這個函式卻是window的屬性,所以this指的是window.  

<2> var a=function a();                          

呼叫方式: a();                                  //window;

a()                         //報錯了

而a()這樣執行這個函式就會報錯;先看報錯這樣的問題吧,在這條語句中,預解析過程中,存貯了變數a,那麼a就一定是window的屬性,而a卻並沒有申明,分配記憶體空間,反過來理解也就是賦值只能在預解析完畢後執行**期間才會進行變數的空間分配,不過執行完畢就自動銷毀了。這裡有必要再重複一遍前面的一句:函式的執行是在身的作用域,而不是在呼叫它的作用域;

可以用這樣的模式來辨別:   a.b=function()   ;    this.指向a;          所謂的這個函式屬於誰的屬性或者說是誰的方法,this就指向誰.

function ()      以及  function a()    這兩種this都指向window   他們不是任何誰的屬性和方法,那麼就是window的屬性和方法;

<3>變數 

var 申明的,this關鍵字,以及函式中的引數都是變數,他們只存在自身的作用域,當然自身的作用域可能是全域性的,全域性的也就可以訪問到,私有的也就保護起來不讓外界訪問,不用var 申明的變數是全域性變數的存在。對於訪問那些私有的成員,比方說私有屬性和方法,可以通過其他突進,比方原型鏈繼承,冒充等方式。

Js 變數及作用域

一 變數包含兩種不同資料型別的值 基本型別值 引用型別值 1 基本型別值 1.簡單的資料段,被儲存在棧記憶體中 2.按值訪問 3.不能給基本型別的值新增屬性 4.從乙個變數向另乙個變數複製值時,會建立這個值的副本,兩個變數不相互影響 2.引用型別值 1.值是儲存在記憶體中的物件,儲存在堆記憶體中 2...

JS變數作用域

先明確一點 討論作用域,討論的是非物件成員的變數。在函式以及自定義物件之外宣告的變數,具有全域性作用域 1.瀏覽器會建立乙個window物件,window的所有屬性,都具有全域性作用域 2.反過來,具有全域性作用域的變數,都是window的屬性 3.具有全域性作用域的變數,任何位置都可以訪問 通過上...

js 變數 作用域

一 基本型別與引用型別 針對引用型別值時,複製的只是乙個指標,複製操作結束後,兩個變數實際上將引用同乙個物件 如果是按引用傳遞的話,那麼p就會被自動修改為指向其name屬性為 greg 的新物件,但是由下圖分析可知,引數傳遞是按值傳遞 二 執行環境和作用域 var color blue functi...