js self = this的解释

简介:

vDemo 1:

复制代码
  function Person(){
        this.name = 'hjzgg';
        this.age = 24;

        this.show = function(){
            alert(name + " " + age);
        }
    }

    var p = new Person();
    p.show();
复制代码

  错误:name 和 age都没有定义。

vDemo 2:

复制代码
  function Person(){
        this.name = 'hjzgg';
        this.age = 24;

        this.show = function(){
            alert(this.name + " " + this.age);
        }
    }

    var p = new Person();
    p.show();
复制代码

  正确。

vDemo 3:

复制代码
  function Person(){
        this.name = 'hjzgg';
        this.age = 24;

        this.show = function(){
            alert(this.name + " " + this.age);
        }
    }

    var p = new Person();
    p.show.call({});
复制代码

  错误:name 和 age 未定义。

vDemo 4:

复制代码
  function Person(){
        this.name = 'hjzgg';
        this.age = 24;

        var self = this;

        this.show = function(){
            alert(self.name + " " + self.age);
        }
    }

    var p = new Person();
    p.show.call({});
复制代码

  通过 var self = this,正确。

 

vDemo 5:

复制代码
  function Person(){
        this.sayHello = function(){
            alert('hello world!');
        }

        this.show = function(){
            sayHello();
        }
    }

    var p = new Person();
    p.show();
复制代码

  错误:sayHello未定义。

vDemo 6:

复制代码
  function Person(){
        var sayHello = function(){
            alert('hello world!');
        }

        this.show = function(){
            sayHello();
        }
    }

    var p = new Person();
    p.show();
复制代码

  正确。

  

v结论:

  每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的,即在全局对象中,this指向的是window对象;在自定义函数中,this对象指向的是调用这个函数的对象,也就是说,this指向的是调用执行环境的那个对象。如果是在函数嵌套环境中,this指代的是调用外部函数或者内部函数的执行环境的对象。
那么这里可能又会出现新的疑问:为什么self.name 和 self.age是正确的呢?
其实这又涉及到另一个话题:实例成员与局部成员。我们创建构造函数的意义就是要用它来创建实例,那么所有属于实例的成员都需要用this来定义;而只有那些不属于实例的成员才不会用this定义;当然,用this定义了方法以后,在函数作用域内部要调用此方法时,就需要加上this了。

vDemo 7:

复制代码
 var person = {
        name : 'hjzgg',
        age : 24,
        show : function(){
            alert(name + " " + age);
        }

   }

   person.show();
复制代码

  错误:name 和 age未定义。

vDemo 8:

复制代码
 var person = {
        name : 'hjzgg',
        age : 24,
        show : function(){
            alert(this.name + " " + this.age);
        }

   }

   person.show();
复制代码

  正确。

vDemo 9:

复制代码
 var person = {
        name : 'hjzgg',
        age : 24,
        show : function(){
            alert(this.name + " " + this.age);
        }

   }

   person.show.call({});
复制代码

  错误:name 和 age 未定义。

vDemo 10:

复制代码
var person = {
        name : 'hjzgg',
        age : 24,
        show : function(){
            alert(person.name + " " + person.age);
        }

   }

   person.show.call({});
复制代码

  正确。

目录
相关文章
|
开发工具 数据安全/隐私保护 Windows
linphone安装和使用教程
<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> 刚刚搞通linphone,终于能连上sip.linphone.org了,中间过程太心酸了。</p> <p style="color:rgb(51,51,51); font-family:Arial; font-size
9757 0
|
消息中间件 运维 监控
使用日志服务LogHub替换Kafka
前几天有客户问到,云上有什么服务可以替换Kafka? 怀着程序员的一丝小小的骄傲回复:日志服务(原SLS)下LogHub功能可以完全替代Kafka等产品,并且在性能、易用性和稳定性上更佳。 但客户将信将疑,于是花了一天时间整理一篇文章,简单从各个角度解释下为何建议用户从自搭Kafka换成
31773 12
|
存储 关系型数据库 MySQL
MySQL中'' ' ' NULL在Innodb存储的区别
MySQL中'' ' ' NULL在Innodb存储的区别
178 0
|
缓存 Java 关系型数据库
GemFire 异步写和同步读
GemFire 异步写和同步读介绍
5140 0
|
SQL 关系型数据库 MySQL
mysql语句性能开销检测profiling详解
之前我介绍过msyql查询优化explain检查命令的使用,explain主要是检查sql语句的基本性能,sql是否优秀,但不能查看具体的涉及硬件资源的开销,今天要介绍的这个profiling工具可以更细节的查看资源的开销,比较详细。
1894 0
|
存储 数据处理 云计算
阿里云邮箱怎么注册
www.jinlehao.com 金乐豪
9702 0
|
分布式计算 大数据 Java
Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍
学习Hadoop的同学们,一定知道如果运行Hadoop自带的各种例子。hadoop-mapreduce-examples项目中还提供了这些例子,本文就其中例子的执行方式进行分析。看看它能否让我们学习mapreduce编程变得更加容易。
5107 0