call(),apply(),bind()区别?
每个函数都包含两个非继承而来的方法,apply()和call(),这两方法的用途都是在特定的作用域中调用函数,实际上等于设置函数数体内的this对象的值。
apply()和call()第一个参数都一样,运行函数的作用域
apply()第二个参数是数组,call()其余参数直接传给函数。
function() sum(num1, num2){
return num1 + num2;
}
function() callSum1(num1, num2){
return sum.apply(this, arguments); //传入arguments对象
}
function callSum2(num1, num2){
retrun sum.apply(this, [num1, num2]);
} alert(callSum1(10,10)); //
alert(callSum2(10,10)); //
在上面例子中,callSum1在执行sum()函数传入了this值(因为是在全局作用域中调用的,所以传入的就是window对象)和arguments对象。callSum2同样也调用了sum()函数,但传入的是this 和一个参数数组。
call()方法和apply()方法的作用相同,它们的区别仅在于接收参数的的方式不同,对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数都是直接传递给函数,在使用call()方法时,传递给函数的参数必须逐个列举出来。 如下列子所示。
function sum(num1, num2){
return sum1 + num2;
} function callSum(num1, num2){
return sum.call(this, num1, num2);
} alert(callSum(10, 10)) //
传递参数并非apply()和call()真正的用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域。
window.color = 'red';
var o = { color: 'bule' };
function sayColor() {
alert(this.color);
} sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColot.call(o); //bule
这个例子是在前面说明this对象的示例基础上修改而成的,这一次,sayColor()也是作为全局函数定义的,而且在全局作用域中调用它时,它的确会显示'red'——因为对this.color的求值会转换成window.color的求值。而sayColor.call(this)和sayColor.call(window),则是两种显示地在全局作用域中调用灌输的方式,结果当然都会显示“red”.但是当运行sayColor.call(o)时,函数执行环境就不一样, 因为此时函数体内的this对象指向了o,于是结果显示的是‘blue’。
使用call()和apply()来扩充作用域的最大好处,就是对象不需要与方法耦合关系。
es5还定义了一个方法,bind()。这个方法会创建一函数实例,其this值会被绑定到bind()函数的值。
window.color = 'red';
var o = { color: 'blue' } ;
functuon sayColor(){
alert(this.color);
} var objSayColor = sayColor.bind(o);
objSayColor(); //blue
sayColor()调用bind()并传入对象哦,创建了objSayColor()函数。 objSayColor()函数的this值等于哦,因此即使在全局作用域中调用这个函数,也会看到‘blue’
一个简单bind()函数接受一个函数和一个环境,并返回一个在给定环境中调用给定的函数,并且将所有参数原封不动传递过去。语法如下
function bind(fn, context){
return function(){
return fn.apply(context, arguments);
}
}
这个函数似乎很简单,但其功能是非常的强大,在bind()中创建了一个闭包,闭包使用apple()调用传入的函数,并给apply()传递context对象和参数。注意这里使用的arguments对象是内部函数的,而非bind()的。当调用返回函数时,它会在给定环境中执行被传入的函数并给出所有参数。
call(),apply(),bind()区别?的更多相关文章
- call apply bind 区别?
call apply bind 区别? 例:定义一个计算器,没绑定bind的为公共计算器,call可以调用,绑定bind的为私人计算器,别人调用不了, //ps:用bind绑定的call强制作借用不好 ...
- call, apply, bind 区别
#call, apply, bind 区别及模拟实现call apply bind 三者都可以用来改变this的指向,但是在用法上略有不同 首先说一下call和apply的区别 call和apply ...
- js中的call,apply,bind区别
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
- call(),apply(),bind() 区别和用法
call call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表.当第一个参数为null.undefined的时候,默认指向window. var arr = [1, 2, 3, 8 ...
- js 中arguments,call,apply,bind的使用
//对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...
- bind,apply,call区别总结
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- JavaScript中call,apply,bind方法的区别
call,apply,bind方法一般用来指定this的环境. var a = { user:"hahaha", fn:function(){ console.log(this.u ...
- javascript中的call(),apply(),bind()方法的区别
之前一直迷惑,记不住call(),apply(),bind()的区别.不知道如何使用,一直处于懵懂的状态.直到有一天面试被问到了这三个方法的区别,所以觉得很有必要总结一下. 如果有不全面的地方,后续再 ...
- apply、call、bind区别、用法
apply和call都是为了改变某个函数运行时的上下文而存在的(就是为了改变函数内部this的指向): 如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是 ...
- bind、call、apply的区别与实现原理
1.简单说一下bind.call.apply的区别 三者都是用于改变函数体内this的指向,但是bind与apply和call的最大的区别是:bind不会立即调用,而是返回一个新函数,称为绑定函数,其 ...
随机推荐
- mysql存储过程 带参数 插入 操作
今天再次添补一下小小内容,闲话不多说,直入标题. 先来看下,如何创建带参数的 存储过程(ps:本文只限mysql5及以上版本) CREATE PROCEDURE prSaveFileInfo(Tabl ...
- 小程序中使用ECharts 异步加载数据
官网例子都是同步的,怎么引入及同步demo请移步官网 <view class="container"> <ec-canvas id="mychart-d ...
- Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?
Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...
- 报表平台对CRM系统价值几何
CRM系统即客户关系管理系统,其利用信息科学技术实现市场营销.销售.服务等活动自动化,使企业能高效地为客户提供周到的服务,以提升客户满意度与忠诚度为目的的一种管理经营方式.而CRM报表平台作为一个枢纽 ...
- dbgrideh 哪些行被选中了
在dbgrideh中允许选择多行,如何知道哪些行被选中是个BOOKMARK类型的属性.SelectedRows: TBookmarkListprocedure TForm1.Button1Click( ...
- win2008server R2 x64 部署.net core到IIS--ASP .NET Core HTTP Error 502.5 – Process Failure
服务器win2008server R2 x64 部署.net core到IIS 解决ASP .NET Core HTTP Error 502.5 – Process Failure 问题等 1.发布网 ...
- 使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js
前言:前端小白一枚,刚注册博客,先发个学习过程中新碰到小问题试试水吧~ 摘要:最近在学习bootstrap,偶然碰到了一个小问题,bootstrap网站也没有做过多的解释,今天分享给大家. 问题描述: ...
- monkey常用命令实例
一.常用命令的使用 1.monkey进行压力测试的命令是什么呢? adb shell monkey -p <packagename> <count> eg: adb shell ...
- 使用 Flask-Cache 缓存给Flask提速
https://blog.csdn.net/u013205877/article/details/78013289
- MYSQL内置MYSQL数据库中你可以得到的信息
1:help_topic 可以查看函数帮助,例如:SELECT * from help_topic WHERE name='concat' 可以查看concat函数. 2:SLOW_LOG 慢查询日 ...