如果在一个函数内部访问了外部的变量,那么这个函数和变量就形成了闭包。闭包经常用来间接访问一个变量。
function getScore(){
let score=80
function add(){
score+=1
console.log(score)
}
return add
}
为了在外部访问函数体内的局部变量,可以在函数体内嵌套一个函数,子函数里可以访问它父函数的变量。这样我们就可以通过调用add函数来访问一个变量。JS的特点是函数内部可以访问外部的变量,这就形成了闭包。 闭包的缺点是,由于闭包会使内部变量一直保存在内存中,内存消耗很大。
他们都用来指定this。
function fn(x,y){
console.log(this,x,y)
}
const obj={name:'jack'}
fn.call(obj,1,2)
call方法的第一个参数就是this,从第二个参数开始,是函数的参数列表,以逗号分隔。
fn.apply(obj,[1,2])
apply的第一个参数也是this,与call不同的是,其余参数都放到数组里传进去。
fn.bind(obj,1,2)()
bind方法用于绑定this,第一个参数是this,其余参数同call一样以逗号分隔传进去。与call和apply都不同的是,bind方法会新建一个函数,并不会马上执行,而是先绑定了this和其他参数,这个新建的函数调用时才会执行。
-
100表示迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
-
200表示请求成功
-
201表示该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
-
202表示请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。
-
300表示被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
-
301表示被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
-
404:请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。
-
400:1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。2、请求参数有误。
-
500: 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
-
501: 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
-
Set:
function unique(arr){
return Array.from(new Set(arr))
}
使用Set去重的缺点是对象(包括数组)不可以去重,由于是ES6新语法,兼容性不太好。但是可以去重NaN 2. indexOf:
function unique(arr){
let result=[]
for(let i=0;i<arr.length;i++){
if(result.indexOf(arr[i])===-1){
result.push(arr[i])
}
}
return result
}
缺点:不支持NaN和对象去重
-
事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。我的理解是,由于事件冒泡这个机制,子元素的事件会逐级冒泡到它的父元素身上。如果我们想绑定数量很大的li元素的点击事件,与其在每一个元素上重复绑定,浪费内存,不如把这个事件绑定到他们的父元素身上,委托给父元素。
-
e.preventDefault()可以阻止默认动作,比如表单提交之前需要验证,但是默认点击提交会发送请求,就可以阻止表单的默认动作。
-
e.stopPropagation()可以阻止事件冒泡。子元素的事件会冒泡到父元素身上,但有时我们不希望这样做,就可以阻止子元素冒泡。
-
基于原型的继承:
function Dog(name){
this.name=name
}
Dog.prototype.showName=function(){
console.log(this.name)
}
let dog1=new Dog('小白')
let dog2=new Dog('小黑')
dog1.showName() //小白
dog2.showName() //小黑
函数Dog是构造函数,用new关键字可以创建一个实例对象。这个构造函数里边定义了对象自己的属性。为了共享对象的属性和方法,把这些共有的方法都放到构造函数的prototype属性下。当new一个构造函数创建一个对象时,就自动为这个对象关联了prototype这个原型对象。
- 基于class
class Animal{
constructor(name){
this.name=name
}
showName(){
console.log(this.name)
}
}
Animal父类
class Cat extends Animal{
constructor(name,age){
super(name)
this.age=age
}
}
Cat类继承自Animal父类,就也继承了父类的方法。
let cat1=new Cat('小白',3)
cat1.showName()
//小白