1.值类型和对象类型的数据有什么不同?
值类型:存在栈内存中,是按值操作
对象类型:存在堆内存中,是按地址操作
2.let与var有什么区别。
let、const:
• 不存在变量提升。
• 只能声明一次,不能重复声明
• 变量声明出来存在VO(变量对象)或AO(活动对象)中,不会给window增加属性
var:
• 有变量提升
• 在全局中声明的变量,会给window增加一个属性。
3.简要描述一下变量提升机制。)
当栈内存(作用域)形成,js代码执行之前,浏览器会把所有带有var/function关键词的进行提前‘声明’或者‘定义’,这种预先处理机制称之为‘变量提升’。
4.函数的上级作用域由什么决定?)
由函数创建(定义)的位置决定
5.什么是闭包?
• 一个不销毁的作用域
• 变量的一种保护/保存机制,保护私有变量不受外界影响
6.函数和箭头函数的区别
普通函数有arguments,有this
箭头函数没有arguments;没有自己的this,this由创建所在的执行上下文决定;没有prototype,不能被new执行
7.下面代码是否可以,每隔1000MS依次输出 0 1 2 3 4 5 ?
如果不可以,说明为啥?
以及如何解决?
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, (i + 1) * 1000);
}
不能。var i是全局的i,当setTimeout执行的时候i已经是5了。
var改成let,或者写闭包
for (var i = 0; i < 5; i++) {
setTimeout(function (i) {
console.log(i);
}, (i + 1) * 1000, i);
}
或
var fn = function fn(i) {
return function () {
console.log(i);
};
};
for (var i = 0; i < 5; i++) {
setTimeout(fn(i), (i + 1) * 1000);
}