if (true) {
var name = 'zhangsan'
}
console.log(name)
從上面的例子可以體會到作用域的概念,作用域就是一個獨立的地盤,讓變量不會外泄、暴露出去。上面的name就被暴露出去了,因此,JS 沒有塊級作用域,只有全局作用域和函數作用域。
var a = 100
function fn() {
var a = 200
console.log('fn', a)
}
console.log('global', a)
fn()
全局作用域就是最外層的作用域,如果我們寫了很多行 JS 代碼,變量定義都沒有用函數包括,那么他們就全部都在全局作用域中。這樣的壞處就是很容易裝車。
// 張三寫的代碼中
var data = {a:100}
// 李四寫的代碼中
var data = {x:true}
這就是為何 jquery zepto 等庫的源碼,所有的代碼都會放在(function(){....})()中。因為放在里面的所有變量,都不會被外泄和暴露,不會污染到外面,不會對其他的庫或者 JS 腳本造成影響。這是函數作用域的一個體現。