测试代码:

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的更多相关文章

  1. JS 的 call apply bind 方法

    js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]] ...

  2. JS中call,apply,bind方法的总结

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user: "小马扎", fn: ...

  3. 学习前端的菜鸡对JS的call,apply,bind的通俗易懂理解

       call,apply,bind 在JavaScript中,call.apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向.            a ...

  4. js: this,call,apply,bind 总结

    对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非 ...

  5. js 中call,apply,bind的区别

    call.apply.bind方法的共同点与区别: apply.call.bind 三者都是用来改变函数的this对象的指向: apply.call.bind 三者都可以利用后续参数传参: bind ...

  6. 原生JS实现call,apply,bind函数

    1. 前言 使用原生JS实现call和apply函数,充分了解其内部原理.call和apply都是为了解决改变this的指向.作用都相同,只是传参的方式不同.除了第一个参数外,call可以接受一个参数 ...

  7. js笔记——call,apply,bind使用笔记

    call和apply obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]); 两者作用一致,都是把obj( ...

  8. js 对call apply bind理解

    请参考 http://www.cnblogs.com/xljzlw/p/3775162.html 1.call和apply的区别:参数类型不同var mtt = { name: "mtt&q ...

  9. js new call apply bind 的 原理

    new new 做了什么事?1. 以 Object.protoype 为原型创建一个新对象 2. 以新对象为 this,执行函数的 [[call]] 3. 如果 [[call]] 的返回值是对象,那么 ...

随机推荐

  1. UVa 11181 条件概率

    题意:n个人选r个人,每个人被选中的概率为pi,问最后每个人被选中的概率是多少. sol:就是个简单的概率题,范围还特别小,深搜秒出...然而公式什么的很多还是需要注意的...     条件概率的公式 ...

  2. 从一个action地址获取信息

    get方法 String url_str ="http://127.0.0.1:8400/lxyyProduct/getProductUserNeedUpdate.action?ts=&qu ...

  3. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...

  4. Linux_使用Linux之安装jdk 7

    工具/原料 jdk7源码安装压缩包 方法/步骤   卸载OpenJDK rpm -qa | grep java rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1 ...

  5. Shell之sed用法 转滴

    通过例子学习sed的用法 1,sed介绍    sed可删除(delete).改变(change).添加(append).插入(insert).合.交换文件中的资料行,或读入其它档的资料到 文> ...

  6. 不要在init和dealloc函数中使用accessor

    不要在init和dealloc函数中使用accessor 文章目录 Objective-C 2.0 增加了 dot syntax,用于简单地调用成员变量的 accessor.相当于 java 的 ge ...

  7. 8.0 Qweb 报表编写步骤

    8.0 采用的是Qweb报表,摒弃了7.0中的RML报表. 1.首先在xml文件中注册一个报表: <report id="qweb_test_report" model=&q ...

  8. MAC环境下 nodejs 4.5.0 卸载

    MAC 环境下,我之前的删除 node 环境如果是用brew 安装的 node.js 4.4 之前的版本.可以网上参考其他方法,我之前的帖子也有之前的删除方法.参考帖子: http://www.cnb ...

  9. FZU 2124 bfs+vis记录

    第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合bfs..果断放弃..悄悄的背锅了 然后其实比较简单 只是利用vis记录的时候要分两种状态记录 有没有道具 每到一个地方 就 ...

  10. hdu 1116 并查集和欧拉路径

    ---恢复内容开始--- 把它看成是一个图 只是需要欧拉路径就可以了 首尾能连成一条线即可 如果要判断这个图是否连通 得用并查集 在hrbust oj里面看答案学到的方法 不用各种for循环套着判断能 ...