function test () {
//函數(shù)內(nèi)部都屬于函數(shù)作用域
var a = 10;
}
console.log(a); //外面不可訪問 會報(bào)錯(cuò)
js中沒有塊作用域
{
//花括號內(nèi)的范圍都屬于塊作用域,但js中不存在塊作用域威酒,所以外面可以訪問花括號里面的內(nèi)容
var a = 10;
}
console.log(a); //可以訪問a 10
閉包的原理
//在一個(gè)函數(shù)中定義的變量,當(dāng)這個(gè)函數(shù)調(diào)用完后,變量就會被銷毀运授;如果有
//外部變量指向函數(shù)內(nèi)部的引用蝴韭,導(dǎo)致函數(shù)里面定義的變量無法釋放,就實(shí)現(xiàn)了閉包
function test () {
var a = 20;
var closure = function () {
console.log(a);
}
return closure;
}
var closure = test();
closure(); //20
var/let/const的區(qū)別
var
// 1.定義一個(gè)常量够颠,使用大寫的方式去定義,這個(gè)只是人為的約定榄鉴,值可以被修改的履磨,并不是不可變的
var PI = 3.1415;
PI = 5;
console.log(PI); //值已經(jīng)改變
// 2.被const修飾的變量(常量)不能被修改
const pi = 3.1415;
pi = 5; //不能被修改
console.log(pi); //報(bào)錯(cuò)
// 3.var聲明的變量在塊外可以被調(diào)用,即沒有塊作用域
function test () {
for(var i = 0; i < 10; i++){
// 塊作用域內(nèi)部
}
constlo.log(i); //i在for循環(huán)塊作用域外可以被使用
}
let
// 1.javascript中沒有塊{}作用域
var a = [];
for (var i = 0; i < 10; i++) {
//因?yàn)閖s中沒有塊作用域庆尘,i是全局變量剃诅,每次遍歷i的值都會被改變,最后i的值是10
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
a[8](); // 10
console.log(i); //可訪問i
// 2.使用一對花括號{}代表代碼塊驶忌,被let修飾的變量在塊內(nèi)有效矛辕,塊外無效
var a = [];
for (let i = 0; i < 10; i++) { //for循環(huán)內(nèi)部就是i的作用域
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
a[8](); // 8
console.log(i); //不可訪問i
const
// 1.被const修飾的變量不能被修改
const pi = 3.1415;
pi = 5; //不能被修改
console.log(pi); //報(bào)錯(cuò)
// 2.被const修飾的對象是不可更改的,但是對象內(nèi)部的屬性是可以被更改的
const obj = {
name : "zhangsan",
age : 18
}
obj.age = 19;
console.log(obj.age); //19
obj = {}; //報(bào)錯(cuò)