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...