js
变量作用域与内存
- var
声明作用域 在函数内部声明,属于局部变量;不在内部定义则为全局变量
var声明提升
console.log(message)
var message
// 打印结果undefined
- let
let声明的变量不会提升 let声明的范围是块作用域
for循环中的let声明也只作用于for内部
for (let i = 0; i < 5; ++i) {
setTimeout(() => {
console.log(i)
}, 0);
}
console.log(i) // I undefined
for (let i = 0; i < 5; ++i) {
setTimeout(() => {
console.log(i) // 0 1 2 3 4
}, 0);
}
// console.log(i)
- const
const和let很像,区别是声明必须初始化变量且不能修改,也是块级作用域
基本数据类型
undefined boolean string symbol object function number
typeof无法测出null的数据类型 测出的为object;
instanceof
对于基本类型不适用,因为基本类型不是对象;
Object.prototype.toString.call()也可以检测类型
垃圾回收
通过自动内存管理实现内存分配和资源配置 解决方法:标记清理,应用计数
内存泄漏
定时器可能会导致内存泄漏,定时器一直不清理,或者没有运行结束,则其中引用的变量会一直占用内存
闭包也会导致内存泄漏
闭包
函数内部创建另一个函数,即使外部函数已经执行完毕,但内部函数仍然在运行并且能够访问外部函数的变量
原型链
js的原型链是一种继承的方式,是由原型prototype,原型对象来实现的,每个js对象都连接一个原型对象,这个原型对象连接另一个对象,原型链的顶端是object.protype。当访问一个对象的属性时,沿着他的原型链查找,直到找到,或者到达顶端。
function Person(name) {
this.name = name;
}
Person.prototype.greeting = function() {
return 'Hello, my name is ' + this.name;
};
var person1 = new Person('Alice');
var person2 = new Person('Bob');
console.log(person1.greeting()); // 输出: Hello, my name is Alice
console.log(person2.greeting()); // 输出: Hello, my name is Bob
promise对象
异步编程的解决方案 避免回调地狱的发生
- promise状态
具有三种状态 pending resolved rejected 两个回调函数作为promise的参数 分别是resolve和reject
promise从pending状态开始,如果执行成功就转到成功态并调用回调函数resolve,如果执行失败就转为失败态并调用回调函数reject
promise的方法使用
- then()与c