作用域在JS中是一個很重要的概念,如下是我的理解:
作用域
作用域是變量或者函數(shù)可以訪問的范圍,即作用域控制著變量或者函數(shù)的可見性和生命周期。
在js中變量的作用域一般作用域一般分為兩類:全局變量、局部變量(此處不解釋這兩名詞的意思憨愉,js與其他語言有很大的共通性,我覺得大家很能理解)
全局變量的幾種情況: 定義在最外層函數(shù)的外部
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?定義在最外層函數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?變量定義時未使用var卿捎,直接賦值的變量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?所有window對象的屬性
局部變量:與全局變量不同配紫,局部變量只能在固定的代碼片段中使用。(eg:內(nèi)部函數(shù)定義的變量)此外午阵,js中沒有塊級作用域躺孝,局部作用域是針對函數(shù)說的。
作用域鏈?zhǔn)鞘裁矗?/b>
作用域鏈:當(dāng)代碼在一個環(huán)境中執(zhí)行時底桂,會創(chuàng)建變量對象的一個作用域鏈植袍。
作用域鏈的作用
保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。
自己的理解:當(dāng)一個函數(shù)定義時籽懦,就有了一個作用域鏈于个,在用到這個變量的值時候,先去找內(nèi)部定義的變量暮顺,此時若該變量沒有值就向外層一層一層的延伸览濒,若外層找到則該變量的值就確定下來,若一直未找到則為undefine
newC1().name
function C1(name){
if(name){
this.name = name;
}
}
C1.prototype.name ="Tom";
如上述代碼拖云,C1中的name默認(rèn)為undefine,所以其進(jìn)不去if判斷中应又,但是又因為C1.prototype.name = "Tom"的存在宙项,在prototype中找到了name屬性,所以最后打印出來的答案是"Tom"
延長作用域with與try-catch的catch
with與catch都會在作用域的前端添加一個變量株扛,對于with語句來說尤筐,會將指定的對象添加到作用域鏈中。對于catch語句來說洞就,會創(chuàng)建一個新的變量對象盆繁,其中包含的是被拋出的錯誤對象的聲明。
with對象只能使用屬性旬蟋,而不能改變屬性