let 和 var 引起的閉包面試題

2021-09-24 02:19:49 字數 838 閱讀 6455

首先閉包的形成的條件:

1.有兩個函式

2.兩個函式是巢狀關係

3. 內部的函式呼叫了內部函式的變數

其次變數的查詢規則:沿著作用域鏈逐層往外面查詢,直到找到全域性的,(屬性找不到為undefind,變數為err)

最重要的一句話:js函式在執行的時候在他們被定義的作用域中,而不是被執行的作

下面進入正題,這是乙個面試題:

var a = ;

for (var i = 0; i < 10; i++) ;

}a[1](); //10

console.log(i) //10

console.log(a[1]); //function()

使用var宣告的變數i ,沒有形成乙個塊級的作用域,所以裡面的funciton不能形成乙個閉包,每次也不會儲存i的值

只有當a[i]()這個函式執行的時候,funciton會沿著作用域鏈查詢i的值,父級作用域就是window,這個時候i已經加到了10

var a = ;

for (let i = 0; i < 10; i++) ;

}a[6](); //6

console.log(a[6]); // function()

let  宣告的變數,屬於塊級作用域,宣告週期就在大括號中,在外部是不可以列印的,所以funciton在內部就形成了乙個閉包,

funciton裡面可以引用父級作用域的變數,引用的就是funciton被定義時的父作用域的變數值

所以在執行a[i] = function () 的時候 fucniton都儲存了當時的i值

經典面試題 var 和 let 的區別

先看乙個 console.info x undefined。因為在後面用 var 定義了變數。var x 100 console.info x 100以上 相當於 var x var 定義的變數被提公升到前面來定義。這個現場就是 變數提公升 console.info x undefined。因為在後...

面試題 閉包問題

function console.log y console.log x console.log y 輸出結果為 1 console.log x 輸出結果為 error,直接報錯 解析宣告變數 從右向左賦值,可分解為 y 1 var x y 可見 y 為全域性變數,x為閉包函式內的區域性變數,在co...

JS閉包 面試題

function setobj p p.name bb var p setobj p console.log p 程式的執行結果是aa 匿名函式的this一般是指向window var number 2 var obj var fn1 obj.fn1 console.log number 匿名函式呼...