前言

理解javascript的指针就需要先了解js的执行环境和作用域!执行环境的定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有的变量和函数都保存在这个对象中。虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它。

1、全局执行环境

全局执行环境是最外围的一个执行环境,根据js实现的宿主环境的不同,表示执行环境的对象也不一样。在web浏览器中认为window就是全局执行的对象。因此所有的全局变量和函数都是作为window对象进行创建的。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有的变量和函数定义也会被销毁。每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出。

2、作用域链

当代码在一个环境中执行时候,会创建变量的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有的变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在的环境的变量对象,如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始的时候只包含一个变量,arguments对象。作用域链的下一个对象来自包含(外部)环境,而再下一个对象则来自下一个包含对象,这样一直延续到全局。

JavaScript由于其在运行期进行绑定的特性,JavaScript 中的 this 可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用。

看下面第一个例子

var point = { 
      x : 0, 
      y : 0, 
     moveTo : function(x, y) { 
                     console.log(this);//1
                     this.x = this.x + x; 
                     this.y = this.y + y; 
             } 
   };
point.moveTo(1,1); //this 绑定到当前对象,即point对象
console.log(point);//2

第一个位置上的this我们打印的时候发现这里的this指向就是point 这个对象!

point.moveTo()这个方法执行后就更改了对象point的属性x和y

第二个例子

function func(x) { 
       this.x = x;
      console.log(this);

func(2);

我们发现这个时候的this指向是window  why?

这个很好理解,func(2) 可以写成window.func(2);由于任何函数或者全局的属性都是window对象下面的,那么这里的this当然就是window

第三个例子

var point = { 
      x : 0, 
      y : 0, 
      moveTo : function(x, y) { 
                      // 内部函数
                     var moveX = function(x) { 
                                          console.log(this);
                                          this.x = x;
                                          }; 
                     // 内部函数
                     var moveY = function(y) { 
                                          this.y = y;
                                           console.log(this);
                                          }; 
                    moveX(x); 
                    console.log(moveX() in point);//false
                    console.log(moveX() in window);//true
                    moveY(y); 
          } 
}; 
point.moveTo(1,1); 
point.x; //=>0 
point.y; //=>0

上面的代码我们分析下很好理解!执行point.moveTo(1,1)里面有两个方法,moveX和moveY,这两个方法并没有绑定到对象point上,我们知道所有的方法都是属于window对象的,那么这里的moveX和moveY实际上是window上调用的,并不是属于point对象!

第四个例子

function Point(x,y){ 
          console.log(this);//第一次是通过new创建的,返回的是Point{} 它是一个对象,不是单纯的方法了
          this.x = x; // this ?
         this.y = y; // this ?
}
var np=new Point(1,1);//所以这里可以理解成这样
/*
           var np = {
                      x = 1,
                      y =1
               };
*/
np.x;//1
var p=Point(2,2);//这个时候不是通过new创建,就相当于window.Point(2,2),它就绑定到window上了!所以this指向window
console.log(p);//由于函数Point没有返回值,所以这里的p = undefined
p.x;//error, p是一个空对象undefined

总结:

调用形式
this指向
普通函数 全局对象window
对象的方法 该对象
构造函数 新构造的对象

文章参考地址:

http://www.cnblogs.com/isaboy/

http://www.cnblogs.com/isaboy/archive/2015/10/29/javascript_this.html

javascript this指针指向?的更多相关文章

  1. Javascript this指针

    Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.   前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对 ...

  2. 指针的指针&指向指针数组的指针

    一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...

  3. 图解javascript中this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...

  4. OC3-父类指针指向子类对象

    // // Cat.h // OC3-父类指针指向子类对象 // // Created by qianfeng on 15/6/17. // Copyright (c) 2015年 qianfeng. ...

  5. javascript的this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...

  6. 关于C++的子类指针指向父类

    基类指针引用派生类对象 用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的; 但是只能引用基类成员. 若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错 ...

  7. restrict关键字(暗示编译器,某个指针指向的空间,只能从该指针访问)

    我们希望某个对象(内存空间)不被修改的通常做法是什么?声明该空间的const类型,但是这样真的可以吗?是不是的,由于const空间对象的指针是可以付给一个非const值指针的.所以这仍然无法不让该空间 ...

  8. JavaScript对象的指向问题

    JavaScript对象的指向问题 标签(空格分隔): JavaScript 对象 在接触了JavaScript之后,我们常听到一句话就是一切皆对象,意思是说除了object以外,JavaScript ...

  9. c++ 动态判断基类指针指向的子类类型(typeid)

    我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...

随机推荐

  1. OCP-1Z0-051-标题决心-文章2称号

    2. View the Exhibit to examine the description for the SALES table. Which views can have all DML ope ...

  2. Java多线程中wait, notify and notifyAll的使用

    本文为翻译文章,原文地址:http://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 在Java的Obje ...

  3. UVa 208 - Firetruck 回溯+剪枝 数据

    题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...

  4. NSIS:卸载加密码示例

    原文 NSIS:卸载加密码示例 最近有几个同学问我关于卸载时加密码的问题,其实很简单,懂点基础就可以根据安装加密码那篇文章http://www.flighty.cn/html/bushu/201009 ...

  5. SQLServer表变量对IO及内存影响测试

    原文:SQLServer表变量对IO及内存影响测试 1. 测试创建表变量对IO的影响 测试创建表变量前后,tempdb的空间大小,目前使用sp_spaceused得到大小,也可以使用视图sys.dm_ ...

  6. 【C/C++学院】(24)Oracle数据库编程--管理oracle

    一.启动和停止oracle 停止和启动oracle须要切换到oracle用户才干够,其它用户都没有权限启动和停止oracle(包含root也没有权限). 1.执行sqlplus但不登录到oracle: ...

  7. 使用批处理文件命令行方式快速启动和停止IIS、SqlServer

    原文:使用批处理文件命令行方式快速启动和停止IIS.SqlServer 虽然现在内存便宜了,但是自己还是嫌自己的512M内存太小,没办法,后台运行的东西太多了,有很多都是有用的没法关闭的.IIS和SQ ...

  8. JavaEE(14) - JPA关联映射

    1. 单向N-1关联映射 2. 单向1-1关联映射 3. 单向1-N关联映射 4. 单向N-N关联映射 5. 双向1-1关联映射 6. 双向1-N关联映射 7. 双向N-N关联映射 1. 单向N-1关 ...

  9. HDU 3172 Virtual Friends(并用正确的设置检查)

    职务地址:pid=3172">HDU 3172 带权并查集水题.每次合并的时候维护一下权值.注意坑爹的输入. . 代码例如以下: #include <iostream> # ...

  10. HTML5游戏开发引擎Pixi.js完全入门手册(二)元素对象属性解析

    下面,我们来解释下PIXI里面对象的各个属性.. 首先我们来看看这个各个元素对象里面到底长啥样.. alpha Number 整个舞台对象的透明度. buttonMode Boolean 渲染是否作为 ...