首先说下this这个对象的由来(属于个人理解):
每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments,换句话说,每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的,即在全局对象中,this指向的是window对象;在自定义函数中,this对象指向的是调用这个函数的对象,
也就是说,this指向的是调用执行环境的那个对象。
如果是在函数嵌套环境中,this指代的是调用外部函数或者内部函数的执行环境的对象;

(注意:可以通过使用call()或者apply()改变函数执行环境的情况下,this就会指向其他对象。)

哎。。以上的描述还是有点啰嗦,那么就看例子吧:
 /*----- 2014-2-10 这个例子是错误的 -----*/
function BaseType(name,age){
    //用一个变量保存当前函数执行环境中的this对象
    //这里可能会有疑问:为什么非得把this保存起来呢?这是因为,内部函数(比如本函数里面包含的两个匿名函数)
    //在搜索this变量时,只会搜索到属于它自己的this,而不会搜索到包含它的那个函数的this。
    //所以,为了在内部函数能使用外部函数的this对象,要给它赋值了一个名叫self的变量。
    var self=this;
    this.name=name;
    this.age=age;
    this.sayHello=function(){
        console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
    }
    this.saySomething=function(){
           //此处用法有点欠妥,完全可以不用self,而用this
           //self.sayHello();
           //正确的做法是:
           return function () { self.sayHello(); }
           //详见:http://skybirdzw.blog.163.com/blog/static/72570626201411032516719/ 

    }
}
var b1=new BaseType("wede",30);
b1.saySomething(); //My name is wede, and i'm 30years old.

从结果来看,是预期的结果。
那么这里可能又会出现新的疑问:为什么在saySomething()方法中非要用self.sayHello()来调用呢,
直接sayHello()多好?
其实这又涉及到另一个话题:实例成员与局部成员。
我们创建构造函数的意义就是要用它来创建实例,那么所有属于实例的成员都需要用this来定义;
而只有那些不属于实例的成员才不会用this定义;
当然,用this定义了方法以后,在函数作用域内部要调用此方法时,就需要加上this了。

为了证明这一点,来看下面的代码:
function BaseType(name,age){
    var self=this;
    this.name=name;
    this.age=age;
    this.sayHello=function (){
        console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
    }
    this.saySomething=function(){
        sayHello();
    }
}
var b1=new BaseType("wede",30);
b1.saySomething(); //ReferenceError: sayHello is not defined
结果显示:sayHello方法未定义。
就是说明,我们调用的其实是局部方法sayHello,而现在只有实例方法sayHello,所以会出现异常。

下面来改装下(注意加粗的部分):
function BaseType(name,age){
    var self=this;
    this.name=name;
    this.age=age;
    var sayHello=function (){
        console.log("My name is "+name+", and i'm "+age+"years old.");
    }

    this.saySomething=function(){
        sayHello();
    }
}
var b1=new BaseType("wede",30);
b1.saySomething();//My name is wede, and i'm 30years old.

可以看出,输出了预期的结果。
而这时候,我们把sayHello方法变成了一个局部方法(对于实例不可见),然后再在saySomething方法中调用就可以了。

关于困惑已久的var self=this的解释的更多相关文章

  1. WPFDataGrid可以编辑某列Bug,困惑已久

    这个问题困扰了好几天,最近在做DataGrid编辑列,有一个添加按钮,当我点击添加按钮的时候自动生成一行,并别生成序列号,然后按回车键完成添加,但是有一个问题就是:当我点击完添加按钮以后,然后继续添加 ...

  2. 期待已久的2013年度最佳 jQuery 插件揭晓

    让人期待已久的2013年度最佳 jQuery 插件揭晓了.在过去的一年里,有很多很多的 jQuery 插件发布出来,而这里文章列出的这些插件从提供的功能更角度来看是其中的佼佼者.相信这些优秀的 jQu ...

  3. IntelliJ IDEA 18 周岁,吐血推进珍藏已久的必装插件

    IntelliJ IDEA是目前最好最强最智能的Java IDE,前几天,他刚刚年满18岁.  本文,给大家推荐几款我私藏已久的,自己经常使用的,可以提升代码效率的插件. IDEA插件简介 常见的I ...

  4. 6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!

    每周趣图 产品经理设计体验/用户实际体验 本周就不写技术分析文章了,分享几个珍藏已久的 IDEA 的「骚技巧」,助你快速完成代码. 还等什么?赶紧上车吧...... 先赞后看,养成习惯.微信搜索「程序 ...

  5. 【Networkk】一篇文章完全搞清楚 scoket read/write 返回码、阻塞与非阻塞、异常处理 等让你头疼已久的问题

    浅谈TCP/IP网络编程中socket的行为   我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗 ...

  6. 期待已久的2012年度最佳jQuery插件揭晓

    近日,国外著名博客WDL发布了2012年度最佳 jQuery 插件.jQuery 自2006年发布以来,经过6年的迅速发展,目前已是最流行和使用最广泛的 JavaScript 框架,这主要归功于众多围 ...

  7. javaScript高级教程(九) ------javascript对象字面量--------困扰已久的问题

    在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ),JavaScript也不例外. ...

  8. 记一次期待已久的渗透 从phpcms到thinkphp

    0X01 前言 这是刚刚开始学习渗透的一个目标吧 这个站从刚开始学的那一天起,就想把他日下来. 可能是自己的信息收集能力太差了吧,导致一直无从下手 没有进展.这是需要慢慢积累的过程.还需努力学习. 0 ...

  9. .NET MAUI发布了期待已久的候选版本(RC1)

    作者:David Ortinau 我们激动地宣布在4/13/2022.NET多平台应用UI (.NET MAUI)发布了候选版本.SDK现在已经集成好了API,可以更新库,并为GA(通用可用性)兼容性 ...

随机推荐

  1. SVG动画示例

    package com.loaderman.customviewdemo; import android.graphics.drawable.Animatable; import android.os ...

  2. socket服务端开发之测试使用threading和gevent框架

    socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...

  3. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_15-网关-路由配置

    4.4 路由配置 4.4.1需求分析 Zuul网关具有代理的功能,根据请求的url转发到微服务,如下图: 客户端请求网关/api/learning,通过路由转发到/learning 客户端请求网关/a ...

  4. 关于Jmeter+Ant+Jenkins作为接口、性能自动化框架的误区

    说明:Apach-Jmeter有完善的桌面客户端,关联数据的处方方式,各种参数化的方式,各种Jar包的扩展,也可以用作抓包工具使用,当然最重要的是它是[开源!开源!开源!],重要的事说三遍,目前也有基 ...

  5. sql 获取本周周一和周日

    版本1.0(获取周日存在问题,请勿使用,仅用于引以为戒) 存在问题,获取周日的时候,当当前时间正好是周日,会获取下一周的周日,而非本周周日. ,)),) ),, ,)),) 版本2.0 看到版本1.0 ...

  6. Java遍历日期代码

    import java.util.ArrayList; import java.util.List; public class DateTraveller { public static List&l ...

  7. MyBatis 的案例

    首先我们需要先下载jar包 其次我们书写具体的内容 Student  Class package entity; /* * 学生类 * */ public class Student { //学生编号 ...

  8. iOS-图形绘制(全)

     画阴影: CGContextRef context = UIGraphicsGetCurrentContext();    CGContextSetFillColorWithColor(contex ...

  9. 阿里云ecs自动创建快照教程

    最近在一个博客联盟的微信群里面看到经常有朋友问阿里云的ecs服务器怎么设置自动创建快照,也不知道最近是怎么了,看到问这个问题的朋友有有四五个左右了,今天就特意到博客里来费大家分享设置自动创建快照的方法 ...

  10. DSP6455的EMIFA口

    DSP6455的EMIFA口 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 支持两种不同的接口模式: 异步接口:标准的SRAM,ROM接口 同步接口:SBS ...