闭包就是能够读取其他函数内部变量的函数。
特性:1、函数内部可以嵌套函数
2、内部函数可以直接访问外部函数的参数和变量
3、参数和变量不会被垃圾回收机制回收
使用场景:数据封装和私有化、模块模式、函数防抖、函数节流
使用闭包就是为了设置私有变量和方法,
好处:能够实现封装和缓存
坏处:就是内存消耗,使用不当可能会造成内存溢出。
function Add(i=0){
return function(){
return ++i;
}
}
var v=Add();
console.log(v()); //1
console.log(v()); //2
变量和函数声明的提升会被提升到最顶部去执行
函数的提升高于变量的提升
如果在函数内部用var声明了与外部相同的变量,则不向下寻找
匿名函数不会被提升
不同块中互不影响
this总是指向直接调用者;
如果有new关键字,则指向new出来的那个对象;
在事件中,this指向触发这个事件的对象,特殊的是:在IE中的attachEvent中的this总是指向全局对象window。
冒泡型事件:当使用冒泡型事件时,子级元素先触发,父级元素后触发。
捕获型事件:当使用捕获型事件时,父级元素先触发,子级元素后触发。
栈内存:存储的都是局部变量,后进先出,栈内存的更新速度很快,因为局部变量的声明周期都很短;
堆内存:存储的都是数组和对象,堆里面的实体不会被释放,但是会被当成垃圾,java有垃圾回收机制不定时地收取;
forEach是最基本的循环,默认有三个参数:array、item、index
map的用法和forEach基本一致,不同的是它会返回一个数组,所以callback需要有return值,如果没有,会返回undefined;
new Set()、indexOf、利用includes、sort(不推荐)
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray1 = [...new Set(array)];
const uniqueArray2 = array.filter((value, index, self) => self.indexOf(value) === index);
const uniqueArray = array.reduce((accumulator, currentValue) => { if (!accumulator.includes(currentValue)) { accumulator.push(currentValue); } return accumulator; }, []);
const uniqueObj = {};
const uniqueArray = array.filter((item) => uniqueObj.hasOwnProperty(item) ? false : uniqueObj[item] = true);
工厂方法、构造函数方法、原型方法、组合使用构造函数和原型方法。
原型链继承:原型链是JS对象模型的基础,每个对象都有一个原型,对象可以从原型继承属性和方法。
构造函数继承:通过调用父类构造函数来实现继承,同时覆盖子类的构造函数。
组合继承:先通过构造函数继承属性,再通过原型链继承方法。
原型式继承:直接使用父类的原型作为子类的原型。
数据类信、运算、对象、Function、继承、闭包、作用域、原型链、Ajax、Dom、Bom、内存泄露、跨域、异步装载、模版引擎、前端MVC、路由、模块化、Canvas、ECMAScript
简单来说,函数式编程是一种编程规范,也就是如何编写程序的方法论;
作用域的作用:是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的,
事件代理又称之为事件委托,就是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务;
ajax的原理简单来说就是在用户和服务器之间加了一个中间层(ajax引擎),由XmlHttpRequest对象