你們對這句話是否是很熟悉?咱們無論看文檔仍是項目組的人都會提及這幾個定義變量的事情,今天小弟給你們說說這幾中定義方式的區別node
var name = 'jack';console.log(window.namne) // jack
window.name = 'jack'
for(var i = 0;i < 5; i++){
setTimeout(() => {
console.log(i);
}, 1000)
}
console.log(window.i) // 5
複製代碼
爲何for循環裏面不寫定時器或者ajax或者event事件單單打印i爲何是12345呢?由於在for內部的定時器/ajax/event事件都引用了變量i致使i變量沒法被內存機制收回而保存在代碼塊內部(這裏不懂的童鞋能夠看看閉包)
因此在單單打印i或者不對i進行操做的話是一切正常的
let i = xxx
這就保證了每一次的循環都是一個新值var num = 10
function fn() {
console.log(num)
var num = 20
}
複製代碼
undefined
。var聲明的變量是有變量提高的 在函數內部我聲明瞭 var num = 20 //無論我寫在函數哪裏都會被提高到函數的最頂部
因此這段代碼的順序是:先執行第一句 定義num並賦值10。走到函數內部引擎發現函數內部有var就把這句提到函數頂部至關於:function fn() {
複製代碼
var num = 20
sonsole.log(num)
// 注意!變量提高只是把聲明提到了頂部可是沒有賦值因此num是 undefined
}
複製代碼
function fn() {
console.log(num)
let num = 20
// num is not defined
}
複製代碼
var num = 10
function fn() {
console.log(num)
var num = 20
}
複製代碼
const obj = {}
複製代碼
obj.name = 'jack'
obj.sex = 'male'
爲何這樣不會報錯呢?
複製代碼
const obj = {}
建立了一個object object是複雜類型他實際上是指向的內存和指針 obj.name = 'jack'
只是在內存裏有加了一條數據並無直接改變obj的指向因此不會報錯。array同理const obj = {}
obj = []
你們說這樣會不會報錯呢?
複製代碼
- 魯迅曾經說過 能把本身的知識輸出給其餘人 才表明你真正懂了
- 我想把本身當時學過的思路和你們分享
- 上面的demo只是最基本的形式,爲了方便說明用的都是全局定義
複製代碼