call和apply和bind的区别
@(前端)
"use strict"//->告诉当前浏览器接下来的js代码将按照严格模式编写
var obj={name:"zhufen"};
function fn(num1,num2){
console.log(num1+num2);
console.log(this);
}
fn(100,200);//this->window num1=100 num2=200
fn.call(100,200);//this->100 num1=200 num2=undefined num1+num2=NaN
fn.call(obj,100,200);//this->obj num1=100 num2=200 call方法执行时所传入的第一个参数是谁 this就是谁 第二个及以后的参数就是fn执行时传入的形参值。
fn.call();//this->window
fn.call(null);//this->window
fn.call(undefined);//this->window
//如果不写或者写null或undefined this为window
以上都为非严格模式下
严格模式下
fn.call();//this->undefined
fn.call(null);//this->null
fn.call(undefined);//this->undefined
apply
apply和call方法的作用是一模一样的,都是用来改变方法的this关键字并且把方法执行:而且在严格模式下和非严格模式下对于第一个参数是null/undefined这种情况的规律也是一样的;
fn.call(obj,100,200);
fn.apply(obj,[100,200]);//call在给fn传递参数的时候,是一个个的传递值的,而apply不是一个个传,而是把要给fn传递的参数值统一的放在一个数组中进行操作->但是也相当于一个个给fn的形参赋值,call跟apply的惟一区别
//bind:这个方法在IE6~8下不兼容->和call/apply类似,都是用来改变this关键字的
//fn.call(obj,1,2);->改变this和执行fn函数一起都完成了
fn.bind(obj,1,2);//->只是改变了fn中的this为obj,并且给fn传递了俩个参数值1,2,但是此时并没有把fn这个函数执行
//->预处理:事先把fn的this改变为我们想要的结果,并且把对应的参数值也准备好,以后要用到了,直接的执行即可
var tempFn = fn.bind(obj,1,2);
tempFn();//执行bind会有一个返回值,这个返回值tempFn就是我们把fn的this改变后的那个结果;