1. call apply bind的作用 —- 用来改变函数中this的指向
2. call 的使用方法
call()中第一个参数:用来改变this指向
call()中从第二个参数开始,相当于给call点前面的函数,从左往右一个个的传参;
把call点前面的函数中的this关键字变成call的第一个参数;
注意:如果call前面的函数中没有this关键字,那么就不需要修改,直接调用此函数即可;
把call点前面的函数调用;
例子:
var obj={name:'aaa'};
function fn(n,m){
console.log(this,(n+m)); //()用来提高优先级
}
fn.call(obj,2,3); //window的全局方法;{name: "aaa"} 5
3. apply 的使用方法
apply总共有两个参数:1.用来改变this指向 2.把所有的实参放在一个数组中;
但是,它对apply点前面的函数进行传参的时候,相当于给fn1的参数从左往右一个个的传参;
例子:
var obj={};
function fn1(n,m){
alert(this+(n+m));
}
fn1.apply(obj,[2,3])
4. bind 的使用方法
bind属于预处理机制:
bind()会提前修改后函数中的this和参数,然后返回个修改后的函数;等需要的时候,手动调用;
bind的传参方式,跟call一样;第一个参数改变this的指向,从第二个参数开始一个个的传参;
例子:
var obj={};
function fn(n,m){
alert(this+(n+m))
}
var res=fn.bind(obj,2,3); //bind的传参方式跟call 一样;
res();//是个新地址,跟以前没关系;
fn(2,3);
/*
* 预处理机制:
* 1.当调用bind方法的时候,会预先把fn中的this改成obj,同时如果有参数的话,也会给fn中的形参赋值
* 2.把已经修改好的fn,返回;
* 3.在我们需要的时候,手动调用;
*/
5. call,apply,和bind区别
call,apply在this被改变后,函数会立即执行;
bind属于预处理机制:bind()会提前修改后函数中的this和参数,然后返回个修改后的函数;等我们需要的时候,手动调用;
bind的传参方式,跟call一样;只有apply的第二个参数是一个数组;其他的都是从第二个参数开始一个个的传参;
6. 关于函数中的this总结
1.当元素的事件被触发的时候,执行一个方法,方法中的this指向当前这个元素
2.自执行函数中的this,永远是window;
3.当函数被调用的时候,点前面是谁,this就是谁;
4.构造函数中的this指向当前实例
5.回调函数中的this一般是window;
6.当遇到call,apply,bind的时候,以上规律都不适用,他们可以通过第一个参数去改变this指向;
7. 严格模式和非严格模式下的不同
严格模式 //”use strict”//
var obj={};
function fn(){
alert(this)
}
//在严格模式下,给call的第一个参数传什么,this指向就是什么
fn.call(null);
fn.call(undefined);
fn.call(); //不传也是undefined;
非严格模式下
fn.call();//没有穿第一个参数,this 是window;
fn.call(null)//传null,this也是window;
fn.call(undefined)//传undefined,this也是window;
//apply跟call在this方面一模一样;