js 函數 作用域 全局作用域 局部作用域 閉包


一個變量沒有聲明但調用 直接報錯,聲明沒有賦值會顯示未定義。

作用域

作用域(scope):一條數據可以在哪個范圍中使用。 通常來說,一段程序代碼中所用到的數據並不總是有效/可用的,而限定這個數據的可用性的代碼范圍就是這個名字的作用域。作用域的使用提高了程序邏輯的局部性,增強程序的可靠性,減少名字沖突。

變量(數據)js中,變量的作用域有兩中,一種是全局作用域(全局變量) ,一種局部作用域(局部變量),一個變量是全局變量還是局部變量,主要看變量聲明的位置。聲明在函數內部,就是這個函數(function)的局部變量。(在js的ECMAScript5.1中只有函數才會產生作用域)?

全局作用域:---在任何地方都能訪問, 函數外定義的變量擁有全局作用域 不使用var定義的變量擁有全局作用域。 所有window對象上的屬性

function fn(){

window.nub = 100;

}

fn();

alert(nub);

加在window上邊的內容作用域 屬於全局的,屬於window的屬性,可以不用寫window,直接寫屬性名就行 / / function fn(){ nub = 100; } fn(); alert(nub);

變量如果不加聲明,就默認認為是window的內容,作用域變成全局了

1 加在window上的內容作用域屬於全局的。 屬於window的屬性,可以不用寫window,直接寫屬性名即可

2 變量若不加聲明,就默認為window的內容,作用域變成全局。

3 沒有聲明在如何函數內部的變量(全局),就是全局變量在全局的任何地方就可以調用和修改,盡量不要使用全局變量,會早成全局污染 全局命名空間污染 在程序中經常需要引用一些庫,如C++編譯系統提供的標准庫、由第三方軟件開發商提供的開發庫或者用戶自己開發的庫等。如果在這些庫中含有與程序中定義的全局實體同名的實體,或者不同的庫之間有同名的實體,則在編譯時都會出現名字沖突,這就稱為全局命名空間污染 (命名沖突)

全局作用域 --- 在任何地方都能訪問 函數外定義的變量擁有全局作用域 不使用var定義的變量擁有全局作用域 所有window對象上的屬性擁有全局作用域 沒有聲明在任何函數內部的函數擁有全局作用域 局部作用域 --- 只能在函數內部訪問 使用var在函數內部定義的變量,和使用function在函數內部聲明的函數,擁有局部作用域

域解析

域解析:瀏覽器每讀到一個script標簽,先不執行任何代碼會先把這個代碼快速的瀏覽一遍,然后從中挑出 var和 function 兩個關鍵字。

var: 域解析遇到 var就把var連同它后邊的名字一塊提到所在的script(或function)的最前面,域解析完成之后,在從上往下一行一行執行代碼,如果遇見就= 賦值

function: 預解析遇到function,就把整個函數提到script(或function)的最前面。(跟在var的后邊預解析先解析var 在解析 function)function的優先級高於var

作用域鏈

[[Scopes]] : 作用域 當我們聲明一個函數的時候,同時該函數就會創建一個屬性這個屬性是[Scopes],我們在這個函數中 聲明的變量都會被存入這個函數的[[Scopes]]屬性中 變量與函數的查找規則: 當我們調用一條數據的時候,js首先會在當前作用域中進行查找,如果找不到,就向上找到父級的作用域,如果在父級的作用域中也找不到,就繼續向上查找,直到window的作用域。如果在window中也找不到,就報錯了

閉包

里面可以訪問外邊的,但是外邊不能訪問里邊的。 閉包: 形式函數中套了一個函數,內層函數可以訪問外層函數中的局部數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM