javascript 基礎(chǔ)攻關(guān)(三)——作用域和閉包
??
題目:
- 說一下對變量提升的理解
- 說明this的幾種不同的使用場景
- 創(chuàng)建10個
<a>標(biāo)簽,點擊的時候彈出來對應(yīng)的序號 - 如何理解作用域
- 實際開發(fā)中閉包的應(yīng)用
執(zhí)行上下文
- 范圍:一段
<script>或者一個函數(shù) - 全局:變量定義、函數(shù)聲明 一段
<script> - 函數(shù):變量定義、函數(shù)聲明、this、arguments 函數(shù)
注意:“函數(shù)聲明”和“函數(shù)表達式”的區(qū)別
console.log(a); //undefined
var a = 100;
fn("zhangsan"); //zhangsan,20
function fn(name) {
age = 20;
console.log(name, age);
var age
}
this
- this要在執(zhí)行時才能確認,定義時無法確認
- 作為構(gòu)造函數(shù)執(zhí)行
- 作為對象屬性指向
- 作為普通函數(shù)執(zhí)行
- call apply bind
```js
var a = {
name: "A",
fn: function() {
console.log(this.name)
}
}
a.fn(); //this===A
a.fn.call({ name: "B" }); //this==={name:"B"}
var fn1 = a.fn;
fn1(); //this===window
```
作用域
沒有塊級作用域
-
只有函數(shù)和全局作用域
//無塊級作用域 if(true){ var name = 'zhangsan'; } console.log(name); // 函數(shù)和全局作用域 var a=100; function fn() { var a=10; console.log('fn',a); } console.log('global',a); //100 fn(); //10
作用域鏈
```js
var a = 100;
function fn() {
var b = 200;
// 當(dāng)前作用域沒有定義的變量,即“自由變量”
console.log(a);
console.log(b);
}
fn() //100,200
```
閉包
使用場景
- 函數(shù)作為返回值
- 函數(shù)作為參數(shù)傳遞
```js
function F1() {
var a = 100;
// 返回一個函數(shù)
return function() {
console.log(a);
}
}
//f1 得到一個函數(shù)
var f1 = F1();
var a = 200;
f1(); //100
```
解題
-
說一下對變量提升的理解
- 變量定義
- 函數(shù)聲明
-
說明this的幾種不同的使用場景
- this要在執(zhí)行時才能確認,定義時無法確認
- 作為構(gòu)造函數(shù)執(zhí)行
- 作為對象屬性指向
- 作為普通函數(shù)執(zhí)行
- call apply bind
-
創(chuàng)建10個
<a>標(biāo)簽,點擊的時候彈出來對應(yīng)的序號var i;
for (i = 0; i < 10; i++) {
(function(i) {
var a = document.createElement('a')
a.innerHTML = i + '
';
a.addEventListener('click', function(e) {
e.preventDefault();
alert(i);
})
document.body.appendChild(a);
})(i)
}
4. 如何理解作用域
* 自由變量
* 作用域鏈,即自由變量的查找
* 閉包的兩個場景
5. 實際開發(fā)中閉包的應(yīng)用
封裝變量,收斂權(quán)限