# read notes **Repository Path**: shishuaichao/read-notes ## Basic Information - **Project Name**: read notes - **Description**: js语言精粹 读书笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-20 - **Last Updated**: 2021-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. var可以重复声明,let不可以重复声明,回报错,xxx has already been declared 2. 函数中变量时私有变量,不是全局变量 + 使用var声明变量,如果有初始赋值的情况,var可以省略。 + 解释在for循环中定义初始值时,var声明的变量可以重复声明,那么修改循环中的变量就相当于修改了全局变量,在循环结束后,全局变量的值就是循环中的结果 + 但是let的声明的变量不能被重复声明,这就造成用法上的区别,for循环中声明初始值用var的话就相当于把全局变量重新声明了一次,而且是包装在函数内部的,就变成了函数的私有变量,不会修改到全局变量 3. for循环中添加不写,默认为true 4. for in 中循环到的属性包含对象原型中的属性,通常可以用obj.hasOwnProperty(key)来判断 5. try catch 用法。如果throw语句在函数中,则该函数调用被放弃,控制流跳转到调用该函数的额try语句中 6. break后面可以跟一个可选label来指定跳出的执行块,不写默认当前块 7. 原型创建先后,在实例化后添加到原型上的属性值,在实例化后添加之前访问。 + 处于严格模式下不能访问到,处于非严格模式下可以访问到,可以解释为变量提升 + 处于非严格模式下可以访问,但是nodejs环境默认有严格模式,无法访问 8. 在es6之前js是没有块级作用域概念的,只有函数作用域 9. 避免在循环中定义函数,可能会带来混淆和无谓的计算.可以在循环外创建一个辅助函数,让这个辅助函数再返回一个绑定了当前循环i值的函数,这样就不会混淆了 10. 有一个问题:jQuery的链式调用和promise的链式调用有什么区别 在我看来jQuery链式返回的是自己,不同顺序是同级别的先后调用问题, $('#b1') .css({color: 'white'}) .css({background: 'blue'}) 两次调用.css方法的是同一个元素 而promise返回的是一个新的promise,先调用和后调用会产生上下级的问题, promise .then(fn1, fn2) .then(fn3, fn4) 第一个.then是promise的成或失败回调,fn1成功回调,fn2失败回调 第二个.then是第一个.then中成功或失败回调,就是fn1或fn2中如果返回成功,走fn3, fn1或fn2中失败,走fn4 调用顺序不同,引起的就是调用的时候接收到的参数不同 拿fn3来说,写在第一行接收到的参数就是,接收到的就是promise中的成功回调的值 写在第二行接收到的就是fn1,或者fn2中的成功回调的值 入参的不同,导致的就是结果的不同 11. 柯里化,通过闭包的方式可以把传入多个参数的函数,拆解成多个函数,第一个传入部分参数返回新函数, 调用新函数,传入剩余参数,返回最终结果。 12. 缓存函数,闭包实现 13. 单次函数,闭包实现 14. 函数调用、方法调用、构造器调用、apply调用