关于JS中的apply,call,bind的深入解析


Posted in Javascript onApril 05, 2016

在Javascript中,Function是一种对象。Function对象中的this指向决定于函数被调用的方式。使用apply,call 与 bind 均可以改变函数对象中this的指向,在说区别之前还是先总结一下三者的相似之处:
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参。

call方法:

语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply:

语法:apply(thisObj,数组参数)
定义:应用某一个对象的一个方法,用另一个对象替换当前对象
说明:如果参数不是数组类型的,则会报一个TypeError错误。

bind:

在EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持),bind与call很相似,,例如,可接受的参数都分为两部分,且第一个参数都是作为执行时函数上下文中的this的对象。不同点有两个:
①bind的返回值是函数;②后面的参数的使用也有区别;

先看例子一:

 

function add(a, b) {
  alert(a + b);
}
function sub(a, b) {
  alert(a - b);
}

对于,call,可以这么用:
add.call(sub,3,1);结果为4

对于,apply,可以这么用;
add.apply(sub,[3,1]);结果为4

对于,bind,可以这么用:
add.bind(sub)(3,1);结果为4

可以看到输出结果都一样,但是传参用法不一样;

再看例子二:

function jone(name,age,work){
  this.name=name;
  this.age=age;
  this.work=work;
  this.say=function(msg){
    alert(msg+",我叫"+this.name+",我今年"+this.age+"岁,我是"+this.work)
  }
}
var jack={
  name:"jack",
  age:'24',
  work:"学生"
}
var pet=new jone();

pet.say.apply(jack,["欢迎您"])
console.log(this.name)

对于call,需要这样:
pet.say.call(jack,"欢迎您!")

对于apply,需要这样:
pet.say.apply(jack,["欢迎您!"])

对于bind,需要这样:
pet.say.bind(jack,"欢迎您")()

此时输出console.log(this.name),发现this.name为jack,this上下文已经发生改变了;

以上这篇关于JS中的apply,call,bind的深入解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 获取图片颜色
Apr 05 Javascript
从零开始学习jQuery (二) 万能的选择器
Oct 01 Javascript
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
JQuery触发事件例如click
Sep 11 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
Oct 10 Javascript
详解微信小程序 页面跳转 传递参数
Dec 08 Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 Javascript
vue中引用阿里字体图标的方法
Feb 10 Javascript
Vue入门之animate过渡动画效果
Apr 08 Javascript
Vue实现导航栏的显示开关控制
Nov 01 Javascript
JavaScript Image对象实现原理实例解析
Aug 26 Javascript
javascript中apply、call和bind的使用区别
Apr 05 #Javascript
JavaScript数组去重的两种方法推荐
Apr 05 #Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 #Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 #Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 #Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 #Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 #Javascript
You might like
如何在php中正确的使用json
2013/08/06 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
再谈javascript面向对象编程
2012/03/18 Javascript
jQuery实现form表单reset按钮重置清空表单功能
2012/12/18 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
Python中的文件和目录操作实现代码
2011/03/13 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
Python中functools模块的常用函数解析
2016/06/30 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
python 美化输出信息的实例
2018/10/15 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
ORACLE十问
2015/04/20 面试题
求职简历自荐信
2014/06/18 职场文书
世界红十字日活动总结
2015/02/10 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
雷锋的故事观后感
2015/06/10 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers