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

  正确。

js self = this的解释的更多相关文章

  1. Js apply 方法 具体解释

    Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...

  2. js 调用 oc 的解释

    JavaScriptCore NSInvocation js解释器在解释函数调用时,会在执行环境进行函数搜索,主调者类型判定: 如果是js调用,直接解释执行: 如果是oc调用,则将调用打包成NSInv ...

  3. js中Prototype属性解释及常用方法

    1.prototype的定义 javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属 ...

  4. node.js基本概念简单解释

    1:什么是回调函数? 2:什么是同步异步 3:什么是I/O 4:什么是单线程/多线程 5:什么是阻塞/非阻塞 6:什么是事件 7:什么是事件驱动 8:什么是事件驱动的回调 9:什么是事件循环 解释: ...

  5. js中的预解释

    在js中,带var 和function关键字的需要预解释: 那什么是预解释?就是在js代码执行之前,先申明好带有var 关键字和带有function关键字的变量,在内存里先安排好.但是带有var关键字 ...

  6. js的Prototype属性 解释及常用方法

    函数:原型 每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文).这个属性非常有用:为一个特定类声明通用的变量或者函数. prototype的定义 你不需要显式地声明一 ...

  7. <!--[if IE]><script type="text/javascript" src="matrix/js/html5.js"></script><![endif]-->代码解释

    块注释例子 1. <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->2. <!--[if IE]> 所有的I ...

  8. js跨域问题解释 使用jsonp或jQuery的解决方案

    js跨域及解决方案 1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说, ...

  9. vue.js权威指南----代码解释实例

    1:P61(值绑定) <input type="checkbox" v-model="toggle" :true-value="a" ...

随机推荐

  1. C# 中对 ArrayList 的排序

    ArrayList 元素 //目录条目类 public class FolderItem { public string filename; public string filetype; publi ...

  2. 【总结】C# 设置委托的机理和简要步骤

    [引语]实际上,和Winform打交道的第一天呢,我们就已经接触了委托,例如当双击button产生button1_click,这个呢,是对button1点击事件的处理方法,至于委托和订阅事件,就悄悄的 ...

  3. 【WPF】WPF中的List<T>和ObservableCollection<T>

    在WPF中 控件绑定数据源时,数据源建议采用 ObservableCollection<T>集合 ObservableCollection<T> 类:表示一个动态数据集合,在添 ...

  4. js库

    lanchpad用的js库 http://lesscss.org/ https://github.com/EightMedia/hammer.js/wiki/Getting-Started http: ...

  5. (转)小小科学家的归来 by 王珢

    小小科学家的归来 by 王垠很多人来信关心我的现状,所以在写别的技术性文章之前,先说说我现在的情况吧.虽然自己追求的东西和经历都比较不同寻常,但是也许可以给奋斗中的人们一些慰藉和鼓励. 首先是超级好消 ...

  6. setView的AlertDialog在受到二次点击后出错

    错误报告: 10-21 13:11:16.009: E/AndroidRuntime(27937): FATAL EXCEPTION: main10-21 13:11:16.009: E/Androi ...

  7. java web(六)多个请求对应一个Servlet

    概要: 提交请求的常用方式有两种,get/post , 运行程序后被请求,在加载执行web.xml文件时通过该文件中的映射关系找到即将要执行的Servlet; 而在要执行的Servlet文件中可通过反 ...

  8. iOS 从某个页面返回然后刷新当前页面

    -------->不说废话 在返回页面实现下面方法: - (void)navigationController:(UINavigationController*)navigationContro ...

  9. 快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,即USE方法

    命令:uptime说明:查看机器分别在1分钟.5分钟.15分钟的平均负载情况,显示的数字表示等待cpu资源的进程和阻塞在不可中断io进程的数量,如果1分钟的平均负载很高,而15分钟的平均负载很低,说明 ...

  10. Spring之注入的几种方式

    普通注入 在配置文件里 <!-- 构造注入 --> <bean id="user1" class="entity.User"> < ...