apply,call,bind的异同?
1.都是用来改变函数的this指向
2.bind用来改变匿名函数(事件体)
3.apply和call通常用来改变有名函数的this指向
4.apply的第二个参数为数组,call按顺序填写
5.bind没有直接调用函数,等价于创建了一个新的函数对象
核心思想,如何改变eat方法中的this指向?
apply和call都是用来改变函数对象this指向的函数
函数对象.apply(被修改的this指向,[函数对象参数1,参数2...])
函数对象.call(被修改的this指向,函数对象参数1,函数对象参数2...);
递归
递归:一个函数直接或者间接的调用自己本身
递归的本质就是函数的嵌套调用
作用:将长代码变短,去掉代码冗余
arguments.callee:代表当前的函数对象本身
柯里化函数
柯里化函数:一个包含一个参数返回一个函数的函数
作用:
1:柯里化实际是把简单的问题复杂化了,但是在复杂化的同时,我们在使用函数时拥有了更加多的自由度
2: 而这里对于函数参数的自由处理,正是柯里化的核心所在。柯里化本质上是降低了通用性,提高了适用性
例:
// 柯里化函数
function checkReg(reg){
return function(str){
return reg.test(str)
}
}
// 生成工具函数,判断用户名
let f1 = checkReg(/^\w{6,18}$/)
console.log(f1("heihei"))
//生成工具函数,判断密码
let f2 = checkReg(/^.{6,}$/);
console.log(f2("123"));
console.log(f2("helloworld"));
prototype 原型
核心问题:行为方法不应该属于每一个实例对象,他们应该属于整个类族,且只有一份
原型对象:原型对象是函数对象(构造函数)的一个属性,他是用来保存所有实例对象共享的属性和方法的
为什么实例化对象可以访问所有的属性和方法?
实例化对象可以直接访问new出来的属性,每个实例化对象都有一个__proto__的属性,该属性指向类的原型对象,所以实例化对象可以访问原型对象上的属性或者方法