你们对这句话是否是很熟悉?咱们无论看文档仍是项目组的人都会提及这几个定义变量的事情,今天小弟给你们说说这几中定义方式的区别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只是最基本的形式,为了方便说明用的都是全局定义
复制代码