博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js self = this的解释
阅读量:7106 次
发布时间:2019-06-28

本文共 2551 字,大约阅读时间需要 8 分钟。

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({});

  正确。

本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/5330486.html,如需转载请自行联系原作者
你可能感兴趣的文章
Redis中hash的理解
查看>>
oracle LOCAL=YES/NO on TNS Connections
查看>>
优秀程序员不得不知道的20个位运算技巧
查看>>
jQuery插件编写格式
查看>>
Mybatis 批量插入以及多参数批量删除
查看>>
grails的criteria实现复合查询并实现结果分页
查看>>
hibernate在ssh三大整合是的配置
查看>>
《Spring Cloud微服务实战》读书笔记
查看>>
nginx之SSI简单使用
查看>>
100-14
查看>>
Python内置数据类型
查看>>
编译android4.0.4 webcore_test报错
查看>>
python PIP包管理工具安装
查看>>
Oracle11g R2安装及卸载
查看>>
puppet自动化运维之user资源
查看>>
Linux无法上外网、ping域名(DNS)
查看>>
kubernetes1.14.1集群部署安装 --k8s
查看>>
golang gzip解压
查看>>
Struts2数据校验
查看>>
LVM 挂载笔记
查看>>