最近在系统的学习面向对象方面的知识,遇到的最大拦路虎就数this的指向,call,apply,bind函数的使用,单独抽出一天时间把这几个烦人的家伙搞定,去学习更深入的内容。

    首先介绍一下this的一些东西,this和call还有莫大的关系,在第一节先不讨论这两在一起的情况。先看看this的应用场景(快餐选手可以直接跳过看后边的总结,一下这些代码只是我学习总结的过程)

    1.全局作用域和一般函数

 this===window    //true
function fn(){ return this;
}
fn()===window //true

可以看到,全局作用域中的this和一般函数里边的this指向都是指向window的。

    2.函数作为对象的一个属性

函数作为对象的一个属性,并且作为对象的一个属性被调用时,函数中的this指向该对象,如下代码this指向了作用域所在的对象obj。。

 var obj={

      age:30,
fn:function(){
return this.age
}
}
obj.fn() //

那函数不作为对象的属性调用呢,看代码:

 var obj={

      age:30,
fn:function(){
return this //此时this指向window
return this.age
}
}
var f=obj.fn;
f.fn() //undefind

该函数的调用是作为定义的全局对象f来执行的,和上边的一般函数的调用实质上是一样的,所以this也会指向window

    3.构造器中的this

 function Class(){
this.age=30
}
var man=new Class() //man.age=30 function Class2(){
this.age=30
return {age:38}
}
var man2=new Class2() //man2.age=38

这里的this代表new出来的那个对象。new会返回一个对象,如果这个对象未定义,则默认return出this对象,在Class2这个构造函数中,如果返回值只有一个age,其他属性是不能调用的,这就可以解释为什么this是new出来的对象,可以自己试一下。

    4.对象原型链上的this

a.构造函数的prototype

 function Fn(name,age){
this.name=name;
this.age=age
}
Fn.prototype.getName=function(){ console.log(this.name)
}
var f1=new Fn("Lebro",30);
f1.getName() //Lebro

b.在整个原型链继承上的this

 var  obj={

       fn:function(){
return this.a+this.b
}
}
var p=Object.creat(obj); //对象p继承了obj的fn函数
p.a=1;p.b=2;
p.fn() //

由此可见,不管是构造函数的prototype,即便是在整个原型链继承中,this代表的也都是当前对象。

    5.call()/apply()上的this

 var obj={

      a:10
}
var fn=function(){ console.log(this)
} fn.call(obj); //{a:10}

当一个函数被call和apply调用时,this的值就取传入的对象的值。我也觉得有点拗口,下节把这几个兄弟再仔细解析一下他们的用法。

总结:this的取值是在函数调用时确定的,在函数声明阶段无法确定(说了一句废话,this设计出来就是为了复用,如果声明阶段就确定了那复用就无从谈起)。

   this总是指向调用this所在函数的那个对象或者作用域。

     这句话其实也是符合call函数的,定义:调用一个对象的一个方法,以另一个对象替换当前对象,在上述例子中其实就是用对象obj替代window来调用fn函数,因此fn里的this就指向调用fn的那个对象obj。this大概有点眉目了吧,下一步就解决三巨头的问题。。。

javascript-this,call,apply,bind简述2 http://www.cnblogs.com/wangxiaosan/p/5513302.html

javascript-this,call,apply,bind简述1的更多相关文章

  1. javascript-this,call,apply,bind简述2

    上节我们一起研究了this这个小兄弟,得出一个结论,this指向调用this所在函数(或作用域)的那个对象或作用域.不太理解的朋友可以看看上节的内容,这次我们主要探讨一下call(),apply(), ...

  2. javascript中call,apply,bind的用法对比分析

    这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们.   关于call,apply,bind这三个函数的用法,是学习java ...

  3. JavaScript中call,apply,bind方法的总结。

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

  4. JavaScript中call,apply,bind方法的总结

    原文链接:http://www.cnblogs.com/pssp/p/5215621.html why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之 ...

  5. JavaScript中call,apply,bind方法的区别

    call,apply,bind方法一般用来指定this的环境. var a = { user:"hahaha", fn:function(){ console.log(this.u ...

  6. JavaScript中call,apply,bind方法

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

  7. JavaScript 之 call apply bind

    关键字 this 绑定的方法 this的动态切换,固然为JavaScript创造了巨大的灵活性,但也使得编程变得困难和模糊.有时,需要把this固定下来,避免出现意想不到的情况.JavaScript提 ...

  8. javascript-this,call,apply,bind简述3

    上节介绍了call()和apply()的用法,这节再讨论一下arguments参数和bind函数的用法以及函数柯里化就算是完结了. bind()函数 先看定义: bind()方法会创建一个函数的实例, ...

  9. javascript中call,apply,bind的使用

    不同点: 1.call():传参方式跟bind一样(都是以逗号隔开的传参方式),但是跟apply(以数组的形式传参)不一样, 2.bind(): 此方法应用后的情形跟call和apply不一样.该方法 ...

随机推荐

  1. sizeof and strlen整理

    sizeof 定义 计算对象或类型所占用的字节数(byte) 记住是字节数,而不是个数 语法 sizeof(对象) int i; sizeof(i); sizeof(类型) sizeof(int); ...

  2. CentOS 编译安装 mysql

    1.前期准备 1.1 环境说明: 操作系统: CentOS release 6.4 (Final) [查看命令 cat /etc/redhat-release ] mysql : mysql-5.6. ...

  3. Visual Studio 2013开启JavaScript的智能提示功能

    在前一次的发布的时候,我们共享了Visual Studio 2013中Windows Azure移动服务的集成和功能.其中包含了移动服务表脚本的编辑能力的介绍.这一次的发布,我们将描述在Visual ...

  4. 图文详解远程部署ASP.NET MVC 5项目 [转载]

    话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署.因此今天专门研究了一下具体的过程,下面和大家分享一下.本人新手 ...

  5. 轻量级linux CRUX安装笔记

    感谢hrdd的分享,原文出处:http://wxdhrdd.blog.163.com/blog/static/120500564200952592240867/ 以下是对原文进行补充 crux的安装: ...

  6. 使用命令行备份指定文件夹并保留最新N份

    客户需要对网站进行定期备份,并保留最近30天的文件,编写后以下脚本,通过Windows的任务计划进行调度 对比手工和任务计划调度运行情况来看,手工运行中可直接调用RAR.exe和网络进行传输,但是任务 ...

  7. [git]解决:git config --global push.default matching

    解决:git config --global push.default matching 这个警告的意思是:需要设置默认push的分支,所以设置好全局push的默认分支就好了.命令如下: 在有git目 ...

  8. ASP.NET MVC权限验证 封装类

    写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...

  9. 分享几个cocos2dx的小游戏

    先上几个自己写的,因为最近要用cocos2dx,所以就边学边开发几个小游戏玩玩,有捕鱼,连连看,还有打地鼠!都不算完整的项目,不过拿来学习还是可以的,或者在基础上再二次开发,扩展自己! 1:捕鱼的 先 ...

  10. 登陆mysql时提示异常的解决方法

    [root@host2 ~]# mysql -uroot -p Enter password: ERROR (HY000): Can't connect to local MySQL server t ...