特色:数组
做用:app
1-1 证实是原函数的拷贝 (须要知道:函数也是对象,而且是引用类型,比较的是内存地址)函数
function fn(){} var bindFn = fn.bind(); //ƒ fn(){ return this } 供之后调用 fn === bindFn //false
2-1 将函数中的this固定为调用bind方法时的第一个参数this
function fn(){ return this } var bindFn = fn.bind({name:"绑定函数"}) //ƒ fn(){ return this }
3-1 之后不管由哪一个对象调用绑定函数,绑定函数中的this依然是{name:"绑定函数"}指针
function fn(){ console.log(this) } var bindFn = fn.bind({name:"绑定函数"}) bindFn() //等同于window对象调用 , this依然指向{name:"绑定函数"} var obj = {name:"obj"}; obj.fn = bindFn; obj.fn() //由普通对象调用 ,this依然指向{name:"绑定函数"} var arr = [bindFn]; arr[0]() //由数组调用 , this依然指向{name:"绑定函数"} setTimeout(bindFn , 200); //做为回调函数 , this依然指向{name:"绑定函数"} clearTimeout(1);
4-1 若是绑定函数做为构造函数,已经捆绑的this会被忽略掉,this依然指向实例对象code
function Person(name){ this.name = name; } var bindPerson = Person.bind({name:"绑定函数"}) new bindPerson("张三") // Person {name: "张三"}
5-1 预设参数对象
function fn(a,b,c,d){ console.log(a,b,c,d) // 1 ,2 ,3 ,4 } var bindFn = fn.bind({name:"绑定函数"} , 1 ,2); // 拷贝原函数时的第2个参数开始日后称为预设参数 bindFn(3,4); //调用绑定函数时的第一参数则排在预设参数的后面
6-1 当没有参数、第一个参数为undefined、第一个参数为null时继承
var obj = { fnOne:function(){ return this }.bind(), fnTwo:function(){ return this }.bind( undefined ), fnThree:function(){ return this }.bind( null ) } //注意:这三种状况是使this指向window对象,而不是不去改变this指向,因此这里的this仍是不会指向obj obj.fnOne() // window obj.fnTwo() //window obj.fnThree() //window
特色:内存
做用:回调函数
1-1 返回值取决于目标函数的返回值
function fn(){ return {name:"call"} } fn.call() // {name: "call"}
2-1 改变目标函数体内的this指向 , 至关于使用第一个参数对象调用
function fn(){ return this } fn.call( { name : "call" } ) // {name: "call"}
3-1 参数位置
function fn(a, b, c){ return arguments } fn.call( { name : "call" } , 1 , 2 , 3 ) //Arguments [1, 2, 3]
1-2 用于继承
function parent(name, age) { this.name = name; this.age= age; } function child(name, age) { parent.call(this, name, age); this.class = '三年级二班'; } var xiaoming = new child("小明" , 18)
特色:
做用:
1-1 参数
function fn(a, b, c){ return a+b+c } fn.apply({name:"apply"} ,[1,2,3]) //6