this关键字
普通函数this指向
谁调用的函数,函数的this就指向谁,否则指向全局
可以通过call apply bind修改函数内部this指向
箭头函数this指向
箭头函数本身是没有 this,箭头函数 this 是定义箭头函数时父级作用域的 this,也就是说使用箭头函数时,箭头函数内部的 this,我们只需要看定义该箭头函数时,该箭头函数父级的 this 即可
于箭头函数自身没有this,所以call、apply、bind对箭头函数是不起作用的
事件模型:事件委托、代理
事件委托的原理 事件从最深的节点开始,然后逐步向上传播事件,委托它们父级代为执行事件。
———————————————————————————————————————
如何让事件先冒泡后捕获
目标元素自身的事件想要先冒泡后捕获,就把添加冒泡事件代码放在添加捕获事件前面。
addEventListener(event,function,useCapture布尔值)ture为捕获
addEventListener(event,function,useCapture布尔值)false为冒泡
对象和面向对象
对象:属性和方法的集合叫做对象(万物皆对象)
面向对象可以看做面向一个具体事物的结果
面向对象的三大特性:
1、封装 :
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。2、继承
提高代码复用性;继承是多态的前提。3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
查找数组重复项
查找该元素首次出现的位置和最后出现的位置下标是否相同,同时判断新数组中是否不存在该元素,如果都满足则添加进新数组中去。
var arr = [1,2,45,44,45,2,89,1,1,2,1,2,44];
Array.prototype.unique = function(){
var arr = this;
var box = [];
for(var str of arr){
if(arr.indexOf(str) != arr.lastIndexOf(str) && box.indexOf(str) == -1){
box.push(str);
}
}
return box;
}
console.log(arr.unique());
数组扁平化
数组扁平化是指将一个多维数组变为一维数组
[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]
扩展运算符
es6的扩展运算符能将二维数组变为一维
————————————————————
遍历数组arr,若arr[i]为数组则递归遍历,直至arr[i]不为数组然后与之前的结果concat。
[].concat(...[1, 2, 3, [4, 5]]); // [1, 2, 3, 4, 5]
根据这个结果我们可以做一个遍历,若arr中含有数组则使用一次扩展运算符,直至没有为止。
function flatten(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
——————————————
递归
递归的遍历每一项,若为数组则继续遍历,否则concat
function flatten(arr) {
var res = [];
arr.map(item => {
if(Array.isArray(item)) {
res = res.concat(flatten(item));
} else {
res.push(item);
}
});
return res;
}
垃圾回收机制
什么是垃圾:
一般来说没有被引用的对象就是垃圾,就是要被清除, 有个例外如果几个对象引用形成一个环,互相引用,但根访问不到它们,这几个对象也是垃圾,也要被清除。
方法:
①JS具有垃圾自动回收的机制: 周期性执行,找出那些不在继续使用的变量,然后释放其内存。②标记清除(常见):
当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。
iframe的优缺点有哪些?
iframe的优点:
① iframe能够原封不动地把嵌入的网页展现出来。
② 如果有多个网页调用iframe,只需要修改iframe的内容,就可以实现对调用iframe的每一个页面内容的更改,方便快捷。
③ 网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用性。
④ 如果遇到加载缓慢的第三方内容,如图标和广告等,可以用iframe来解决。
iframe的缺点:
① 会产生很多页面,不容易管理。
② 在几个框架中都出现上下、左右滚动条时,这些滚动条除了会挤占已经非常有限的页面空间外,还会分散访问者的注意力。
③ 使用框架结构时,必须保证正确设置所有的导航链接,否则会给访问者带来很大的麻烦。比如被链接的页面出现在导航框架内,这种情况下会导致链接死循环。
④ 很多的移动设备(PDA手机)无法完全显示框架,设备兼容性差。
⑤ iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。
现在基本上都是用Ajax来代替iframe,iframe已渐渐退出了前端开发。
函数柯里化(卡瑞化、加里化)?
Currying概念其实很简单,只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数(主要是利用闭包实现的)。