示例: 形成了func函式形成了閉包,按理來說func中的變數并不會被當作垃圾回收掉,所以就會長期存在記憶體中,但是如果我在全域中再訪問num為什么這個num還是undefined?
function func() {
var num = 1
return function() {
console.log(num)
}
}
var a = func()
a()
console.log(num)
uj5u.com熱心網友回復:
定義在函式里的 var 變數的作用域,僅在函式體內,函式外訪問不到的。這個跟閉包沒關系。uj5u.com熱心網友回復:
function func() {
var num = 1
return function() {
console.log(num) // 呼叫a()時,這里可以訪問到 func 中的 num
}
}
var a = func()
a()
console.log(num) // 這里訪問的是 window.num
uj5u.com熱心網友回復:
其實就是作用域的問題,變數num的作用域在方法func里面,外面訪問不了,所以是undefineduj5u.com熱心網友回復:
是不是在記憶體會單獨給這個函式開辟一塊大的空間,然后在這個大的空間里面在開辟個小空間存放這個num ,然后在我們js代碼執行的時候在全域訪問num他只會在跟func同級別的記憶體塊中找,并不會深入到func內部找,然后就會undefineduj5u.com熱心網友回復:
var的作用域會提升,那是var在同一個方法堆疊的前提,var不能超出自身所在的方法堆疊而作用到其他方法堆疊所以,
function func() {
var num = 1 //這個是方法num是在func方法堆疊里
return function() {
console.log(num)
}
}
var a = func()
a()
console.log(num) //這個num是在main方法堆疊里,上面的num跨方法堆疊作用域升級
而
for(let i=0; i<4; i++) {
var j=i; //這個j雖然在for的區域里,當時屬于main方法堆疊,
}
console.log(j); //所以可以作用域提升,這里還是在main方法堆疊,這個和LZ的代碼作用域完全不一樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/249299.html
標籤:JavaScript
上一篇:jstree中的導線是怎么實作的
下一篇:【分享】基于騰訊地圖實作表白效果
