變量提升(預(yù)解析)
javascript的函數(shù)作用域是指在函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終是可見的,有意思的是,這意味著變量在聲明之前甚至已經(jīng)可用。JavaScript的這個特性被非正式地稱為聲明提前,即JavaScript函數(shù)里聲明的所有變量(但不涉及賦值)都被"提前"至函數(shù)體的頂部。
eg:將函數(shù)內(nèi)的變量聲明“提前”至函數(shù)頂部,同時變量初始化留在原來的位置:
var a = 10
function fn(){
console.log(a) //undefined
a =20
console.log(a) //20
}
閉包
函數(shù)可以通過作用域鏈相互關(guān)聯(lián)起來,函數(shù)體內(nèi)部的變量可以保存在函數(shù)作用域內(nèi)。
為什么要使用B包?
1.因為B包可以訪問到函數(shù)內(nèi)部的變量并且會將這些變量的值一直保存在內(nèi)存中。
2.因為B包引用函數(shù)不會被清除,可能會造成內(nèi)存泄漏的問題,貼別是IE
B包的特性?
1.函數(shù)嵌套函數(shù)
2.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
3.參數(shù)和變量不會被垃圾機(jī)制回收
function fn(){
var a = 0
function fn1(){
a++
console.log(a)
}
fn1()
fn1()
}
fn()