zoukankan      html  css  js  c++  java
  • js self = this的解释

    Demo 1:

      function Person(){
            this.name = 'hjzgg';
            this.age = 24;
    
            this.show = function(){
                alert(name + " " + age);
            }
        }
    
        var p = new Person();
        p.show();

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

    Demo 2:

      function Person(){
            this.name = 'hjzgg';
            this.age = 24;
    
            this.show = function(){
                alert(this.name + " " + this.age);
            }
        }
    
        var p = new Person();
        p.show();

      正确。

    Demo 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 未定义。

    Demo 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,正确。

    Demo 5:

      function Person(){
            this.sayHello = function(){
                alert('hello world!');
            }
    
            this.show = function(){
                sayHello();
            }
        }
    
        var p = new Person();
        p.show();

      错误:sayHello未定义。

    Demo 6:

      function Person(){
            var sayHello = function(){
                alert('hello world!');
            }
    
            this.show = function(){
                sayHello();
            }
        }
    
        var p = new Person();
        p.show();

      正确。

      

    结论:

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

    Demo 7:

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

      错误:name 和 age未定义。

    Demo 8:

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

      正确。

    Demo 9:

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

      错误:name 和 age 未定义。

    Demo 10:

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

      正确。

  • 相关阅读:
    eclipse建立工作集管理项目
    echarts-x
    GeoJSON
    mysql 5.7 root password 过期
    kubernetes centos7
    JestClient
    树莓派镜像制作
    docker run elasticsearch
    vm.max_map_count
    远程访问jupyter notebook
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/5330486.html
Copyright © 2011-2022 走看看