call方法call()方法使用一个指定的this值(this指向执行环境上下文)和单独给定的一个或多个参数来调用一个函数。语法fun.call(thisArg[,arg1[,arg2[,...]]])fun:要调用的函数。thisArg:必需。函数运行时指定的this值(this指向执行环境上下文)。arg1,arg2,...:可选。指定的参数列表。注意:指定的this值不一定是函数执行时的真实this值。如果函数处于非严格模式,指定为null和undefined的this值将自动指向全局对象(浏览器中的window对象),this的值是一个基本类型值(数字、字符串、布尔值)将指向原始值的自动包装对象。目的使用call方法调用一个函数并指定this,借用一个你没有的函数。functionspeakName(){console.log('我的名字是'+this.name);}varperson1={name:'chong',}speakName();//speakName是一个全局函数,this指向全局对象window。由于变量名在全局范围内不存在,所以输出:MynameisspeakName.call(person1);//输出:我叫chong使用call方法调用父结构体Function,实现继承函数Product(name,price){this.name=name;这个。价格=价格;if(price<0){throwRangeError('无法创建产品'+this.name+'负价格');}}functionFood(name,price){Product.call(this,name,price);this.category='food';}//上面的Food构造函数等价于下面的代码functionFood(name,price){this.name=name;这个。价格=价格;if(price<0){throwRangeError('无法创建产品'+this.name+'负价格');}this.category='food';}apply方法apply()方法使用指定的this值和作为数组(或类数组对象)提供的参数调用函数。语法func.apply(thisArg,[argsArray])fun:要调用的函数。thisArg:必需。函数运行时指定的this值。argsArray可选。一个数组或类数组对象,其元素将作为单独的参数传递给func函数。apply方法的使用与call方法相同,bind方法不再赘述。bind()方法用于创建新函数。bind()的第一个参数是这个新函数的this,其余参数将作为新函数的参数。语法func.bind(thisArg[,arg1[,arg2[,...]]])fun:要调用的函数。thisArg:必需。作为调用新函数时新函数的this值。如果绑定函数是使用new运算符构造的,则忽略此值。当使用bind在setTimeout中创建函数(作为回调提供)时,作为thisArg传递的任何原始值都将转换为对象。如果绑定函数的参数列表为空,或者如果thisArg为null或未定义,则执行范围的this将被视为新函数的thisArg。arg1,arg2,...:可选。新功能的初始参数列表。返回值:返回具有指定this值和初始参数的原始函数的副本。目的创建绑定函数部分函数:使函数具有预设的初始参数例如:varx=9;varmodule={x:81,getX:function(){returnthis.x;},addX:function(n){returnthis.x+n;}};module.getX();//81模块.addX(9);//90var_getX=module.getX;var_addX=module.addX;_getX();//返回9,因为该函数是在全局范围内调用的_addX(9);//返回18//创建一个新函数boundGetX,并将其绑定为模块对象;varboundGetX=_getX.bind(模块);绑定GetX();//81//1.创建绑定函数boundAddX,将this绑定为模块对象,默认参数设置为10;varboundAddX=_addX.bind(module,10);//调用新函数时不使用再次传递参数(传递没用)boundAddX();//91//2.新建函数boundAddX,将this绑定为模块对象,不带预设参数;varboundAddX=_addX.bind(模块);//调用新函数时,需要传递参数boundAddX(9);//90withsetTimeout默认情况下,当使用window.setTimeout()时,this关键字将指向窗口(或全局)对象。当一个类的方法需要this指向类的一个实例时,你可能需要将this显式绑定到回调函数上,这样实例的引用才不会丢失。functionLateBloomer(){//花瓣数this.petalCount=Math.ceil(Math.random()*12)+1;}//调用bloom后1秒,调用declareLateBloomer.prototype.bloom=function(){window.setTimeout(this.declare,1000);};LateBloomer.prototype.declare=function(){console.log('Iamabeautifulflowerwith'+this.petalCount+'petals!');};varflower=新的LateBloomer();flower.bloom();//一秒后,调用'declare'方法Summarycall和apply有相同点:都可以调用指定this值的函数,都可以给函数传递一个或多个参数。简单来说,它们的目的是一个对象调用/借用它没有的函数。如果这个函数是一个构造函数,就可以实现继承。区别:唯一的区别在于传递参数的形式。call方法通过参数列表传递参数,apply方法通过数组/类数组传递参数。call、apply和bind类似:它们可以在函数执行时改变this,并可以传递一个或多个参数给函数。不同点:bind方法返回一个新的函数,需要调用它才能执行。call和apply会立即执行。参考Function.prototype.call()Function.prototype.apply()Function.prototype.bind()
