浅谈JavaScript中的apply/call/bind和this的使用


Posted in Javascript onFebruary 26, 2017

fun.apply(context,[argsArray])

立即调用fun,同时将fun函数原来的this指向传入的新context对象,实现同一个方法在不同对象上重复使用。

context:传入的对象,替代fun函数原来的this;

argsArray:一个数组或者类数组对象,其中的数组参数会被展开作为单独的实参传给 fun 函数,需要注意参数的顺序。

fun.call(context,[arg1],[arg2],[…])

同apply,只是参数列表不同,call的参数需要分开一个一个传入。如果不知道参数个数,则使用apply。

使用:

Math.max()    //只接收单独的参数,通过下面的方法可以在数组上面使用max方法:
Math.max.apply(null, array);    //会将array数组参数展开成单独的参数再传入
Array.prototype.push.apply(arr1,arr2);    //将一个数组拆开push到另一个数组中;不用apply则会将后续数组参数当成一个元素push进去。
Array.prototype.slice.call(arguments);    //在类素组对象上使用slice方法

function isArray(obj){
  return Object.prototype.toString.call(obj) === '[object Array]' ;
}  //验证是否是数组

fun.bind(context,[arg1],[arg2],[…])

使fun方法执行的context永不变。

arg1:要传递到新函数的参数列表

返回一个函数供后续调用,其函数体和原函数fun一样,但新函数的this指向新传入的context对象。新函数会具有bind方法指定的初始参数arg1/arg2...,后续调用新函数时的实参要往已有参数的后面排。

//原来的函数有4个参数
var displayArgs = function (val1, val2, val3, val4) {
  console.log(val1 + " " + val2 + " " + val3 + " " + val4);
}
var emptyObject = {};
// 生成新函数时bind方法指定了2个参数,则新函数会带着这个两个实参
var displayArgs2 = displayArgs.bind(emptyObject, 12, "a");
// 调用时传入另2个参数,要在bind方法传入的2个实参后面
displayArgs2("b", "c");
// Output: 12 a b c

事件处理函数中使用bind:

var obj = {
  arg1 : 1,
  attach: function(){
    //var self = this; 普通传入this 的方法
    $('xxx').on('click',function (event) {
      console.log(this.arg1);//若不绑定this,回调函数中的this常指目标元素
     }.bind(this));  //使用bind方法绑定this
  }
}

使用bind()方法改写slice()方法:

var _Slice = Array.prototype.slice;
var slice = Function.prototype.call.bind(_Slice);
slice(…);

bind()兼容Ie5~ie8处理

if (!Function.prototype.bind) {
  Function.prototype.bind = function(context) {
    var self = this, // 调用bind方法的目标函数
    args = arguments;
    return function() {
      self.apply(context, Array.prototype.slice.call(args, 1));//参数个数不确定时用apply
    }
  }
}

一般情况下setTimeout()的this指向window或global对象。当使用类的方法时需要this指向类实例,就可以使用bind()将this绑定到调用对象,而不用传入self方式传入this。

this

this对象是在函数运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被当作某个对象的方法调用时,this等于那个对象。

判断方法:this和定义在哪儿无关,函数运行时,如果有. 运算符,this指.前的对象;如果没有,this指window。若new关键字调用时,指代新对象。有apply/call/bind时,指代第一个参数。

/*例1*/
function foo() {
  console.log( this.a );
} 
var obj2 = {
  a: 42,
  foo: foo
};
var obj1 = {
  a: 2,
  obj2: obj2
};
obj1.obj2.foo(); // 42;当foo函数被调用时,其本身是归obj2所拥有
/*例2*/
function foo() {
  console.log( this.a );
} 
var obj = {
  a: 2,
  foo: foo
};
var bar = obj.foo;   // bar引用foo函数本身
var a = "global";   // 全局对象的属性
bar();        // "global" ;

在一个HTML DOM事件处理程序里面,this始终指向这个处理程序被所绑定到的DOM节点。

Javascript 相关文章推荐
JavaScript 保存数组到Cookie的代码
Apr 14 Javascript
js动态删除div元素基本思路及实现代码
May 08 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
AngularJs html compiler详解及示例代码
Sep 01 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
Dec 05 Javascript
jquery滚动条插件slimScroll使用方法
Feb 09 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
js取小数点后两位四种方法
Jan 18 Javascript
原生js代码能实现call和bind吗
Jul 31 Javascript
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
JavaScript中Promise的使用详解
Feb 26 #Javascript
setTimeout函数的神奇使用
Feb 26 #Javascript
node.js入门学习之url模块
Feb 25 #Javascript
从零学习node.js之利用express搭建简易论坛(七)
Feb 25 #Javascript
从零学习node.js之express入门(六)
Feb 25 #Javascript
Node.JS中事件轮询(Event Loop)的解析
Feb 25 #Javascript
走进javascript——不起眼的基础,值和分号
Feb 24 #Javascript
You might like
五个PHP程序员工具
2008/05/26 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
php数据库备份还原类分享
2014/03/20 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
PHP 无限级分类
2017/05/04 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
python pandas模块基础学习详解
2019/07/03 Python
keras.layer.input()用法说明
2020/06/16 Python
Python读取yaml文件的详细教程
2020/07/21 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
关于打架的检讨书
2014/01/17 职场文书
一月红领巾广播稿
2014/02/11 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
警校毕业生自我评价
2014/04/06 职场文书
市场策划求职信
2014/08/07 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
春节慰问简报
2015/07/21 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
导游词之无锡东林书院
2019/12/11 职场文书