天天看點

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中也找不到,就報錯了

閉包

裡面可以通路外邊的,但是外邊不能通路裡邊的。 閉包: 形式函數中套了一個函數,内層函數可以通路外層函數中的局部資料。