JS之call/apply/bind
测试代码:
var a = 1;
var obj = {
a = 2;
}
function test(a){
alert(a);
alert(this.a);
}
1.test(3);
结果:3,1
函数中this指向window对象
2.test.call(thisObj,param1,param2....);
thisObj:test函数中this的指向
param1,param2...:传给test函数的参数
3.test.call(null,3)或者test.call(undefined,3);
结果为:1,3;
当thisObj是undefined或者null时,test中的this指向window
4.test.call(1,3);或者test.call("a",3)或者test.call(false,3)或者test.call([12],3)或者test.call(function(){},3)或者test.call(/ao/g,3);时
结果为:3,undefined
此时this的值为1,"a",flase,[12],function(){},/ao/g;里面没有a属性
5.test.call(obj,3);
结果为:3,2
6.test.apply(thisObj,[param1,param2...]);
除了给test传参数以数组形式,其他和test.call一样
7.test.bind(thisObj,param1,pamra2...);
bind()返回新的函数,这个函数是test的复制,但是里面的this指向thisObj
源码:
Function.prototype.bind = function(scope){
var fn = this;
return function(){
fn.apply(scope);
}
}
案例:
1.
var x = 100;
var foo = {
x:200
}
var bar = function(a,b){
console.log(this.x,a,b);
}
bar(1,2);
var nBar = bar.bind(foo,4,5);
nBar();
bar(1,2)打印出:100,1,2;this指向widdow;
nBar()打印出:200,4,5;this指向foo,而且nBar在创建时,将4,5保存到nBar的参数列表中
2.
var x = 100;
var foo = {
x:200
}
var bar = function(a,b){
console.log(this.x,a,b);
console.log(arguments);
}
bar(1,2);
var nBar = bar.bind(foo,4,5);
nBar(6,7);
nBar执行时:arguments里面保存了4,5,6,7
3.
var myDiv = document.getElementById("myDiv");
var logger = {
x: 0,
updateCount: function(){
this.x++;
console.log(this.x);
}
}
myDiv.addEventListener("click",logger.updateCount);
结果为:NaN
因为在监听器的处理函数中,this指向当前触发事件的对象,在这里是myDiv,为了使得在回调函数中的this指向logger,用logger.updateCount.bind(logger);
var myDiv = document.getElementById("myDiv");
var logger = {
x: 0,
updateCount: function(){
this.x++;
console.log(this.x);
}
}
myDiv.addEventListener("click",logger.updateCount.bind(logger));
4.
function list(){
Array.prototype.slice.call(arguments);
}
var list1 = new list(1,2,3); //[1,2,3]
//创建一个自带默认参数的函数
var myList = list.bind(undefined,37);
var list3 = myList(1,2,3); //37,1,2,3;
JS之call/apply/bind的更多相关文章
- JS 的 call apply bind 方法
js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[, [,.argN]]]] ...
- JS中call,apply,bind方法的总结
why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user: "小马扎", fn: ...
- 学习前端的菜鸡对JS的call,apply,bind的通俗易懂理解
call,apply,bind 在JavaScript中,call.apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向. a ...
- js: this,call,apply,bind 总结
对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非 ...
- js 中call,apply,bind的区别
call.apply.bind方法的共同点与区别: apply.call.bind 三者都是用来改变函数的this对象的指向: apply.call.bind 三者都可以利用后续参数传参: bind ...
- 原生JS实现call,apply,bind函数
1. 前言 使用原生JS实现call和apply函数,充分了解其内部原理.call和apply都是为了解决改变this的指向.作用都相同,只是传参的方式不同.除了第一个参数外,call可以接受一个参数 ...
- js笔记——call,apply,bind使用笔记
call和apply obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]); 两者作用一致,都是把obj( ...
- js 对call apply bind理解
请参考 http://www.cnblogs.com/xljzlw/p/3775162.html 1.call和apply的区别:参数类型不同var mtt = { name: "mtt&q ...
- js new call apply bind 的 原理
new new 做了什么事?1. 以 Object.protoype 为原型创建一个新对象 2. 以新对象为 this,执行函数的 [[call]] 3. 如果 [[call]] 的返回值是对象,那么 ...
随机推荐
- 手把手教你 用 wpf 制作metro ProgressRing (Windows8 等待动画)
效果图: 还在羡慕metro的ProgressRing吗? wpf 也可以拥有 首先说下思路, 一共6个点围绕一直圆转,所以需要使用rotation动画 并且一直转下去. 那么下面的问题就好解决了. ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)
http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...
- OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化
OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...
- imread() not working in OpenCV 2.4.11 Debug mode
The OpenCV function imread() not working in OpenCV 2.4.11 Debug mode of VS2010 under Win32, the way ...
- uploadify 3.2 后台动态传参数
最近在弄一个上传的小功能,需要往后台传递一些动态参数,网上有一些传参数可能是因为版本不对也没成功.仔细看了官网的一些说明,搞定了. 3.2中传递参数用的的是'formData':{'somekey': ...
- Pull解析器学习
1, package com.service; import java.io.InputStream; import java.io.OutputStream; import java.util.Ar ...
- Ubuntu下搭建NodeJS+Express WEB开发框架
Ubuntu下搭建NodeJS+Express WEB开发框架 2012-12-27 15:06 作者: NodeJSNet 来源: 本站 浏览: 2,966 次阅读 我要评论暂无评论 字号: 大 中 ...
- 用正则表达式替换html标签
下面的代码用于修改html文本中的img标记,修改后的html适用于lazyload方式的图片加载: protected string LazyPicProcess(string content) { ...
- linux下svn的co如何排除目录
某些原因想在svn co的时候排除某些目录,可以绕个圈子,分三步来完成: co外层目录: svn checkout --depth empty $URL [$LOCATION] 完成之后,会有一个只包 ...
- 大话数据结构(五)(java程序)——顺序存储结构的插入与删除
获得元素操作 对于线性表的顺序存储结构来说,我们要实现getElement操作,即将线性表的第i个位置元素返回即可 插入操作 插入算法思路: 1.如果插入位置不合理,抛出异常 2.如果插入表的长度大于 ...