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节点。
# call
# apply
# bind
# 区别
# js
# JavaScript中call
# bind的区别与实现
# 一文了解JavaScript中call/apply/bind的使用
# 一文搞懂JavaScript中bind
# call的实现
# JavaScript手写call
# bind方法
# JS 函数的 call、apply 及 bind 超详细方法
# JavaScript函数之call、apply以及bind方法案例详解
# 详解JS中的this、apply、call、bind(经典面试题)
相关文章:
如何快速搭建个人网站并优化SEO?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
网站图片在线制作软件,怎么在图片上做链接?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
微课制作网站有哪些,微课网怎么进?
如何快速打造个性化非模板自助建站?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
中山网站推广排名,中山信息港登录入口?
如何快速搭建高效简练网站?
如何选择CMS系统实现快速建站与SEO优化?
电商网站制作价格怎么算,网上拍卖流程以及规则?
全景视频制作网站有哪些,全景图怎么做成网页?
网站制作壁纸教程视频,电脑壁纸网站?
如何在阿里云ECS服务器部署织梦CMS网站?
建站主机系统SEO优化与智能配置核心关键词操作指南
c# await 一个已经完成的Task会发生什么
魔方云NAT建站如何实现端口转发?
如何快速上传自定义模板至建站之星?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
孙琪峥织梦建站教程如何优化数据库安全?
兔展官网 在线制作,怎样制作微信请帖?
建站上传速度慢?如何优化加速网站加载效率?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
javascript基本数据类型及类型检测常用方法小结
如何彻底删除建站之星生成的Banner?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
制作网站公司那家好,网络公司是做什么的?
制作销售网站教学视频,销售网站有哪些?
江苏网站制作公司有哪些,江苏书法考级官方网站?
网站制作公司排行榜,四大门户网站排名?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
公司网站的制作公司,企业网站制作基本流程有哪些?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
独立制作一个网站多少钱,建立网站需要花多少钱?
建站之星备案是否影响网站上线时间?
Python多线程使用规范_线程安全解析【教程】
h5在线制作网站电脑版下载,h5网页制作软件?
如何选择适配移动端的WAP自助建站平台?
如何在万网自助建站中设置域名及备案?
宝塔Windows建站如何避免显示默认IIS页面?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何通过网站建站时间优化SEO与用户体验?
制作网站的模板软件,网站怎么建设?
建站为何优先选择香港服务器?
如何通过cPanel快速搭建网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何解决VPS建站LNMP环境配置常见问题?
建站之星后台管理:高效配置与模板优化提升用户体验
深入理解Android中的xmlns:tools属性
*请认真填写需求信息,我们会在24小时内与您取得联系。