javascript this指针指向?
前言
理解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指针指向?的更多相关文章
- Javascript this指针
Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象. 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对 ...
- 指针的指针&指向指针数组的指针
一.指针的指针 指针的指针看上去有些令人费解.它们的声明有两个星号.例如: char ** cp; 如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...
- 图解javascript中this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...
- OC3-父类指针指向子类对象
// // Cat.h // OC3-父类指针指向子类对象 // // Created by qianfeng on 15/6/17. // Copyright (c) 2015年 qianfeng. ...
- javascript的this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...
- 关于C++的子类指针指向父类
基类指针引用派生类对象 用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的; 但是只能引用基类成员. 若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错 ...
- restrict关键字(暗示编译器,某个指针指向的空间,只能从该指针访问)
我们希望某个对象(内存空间)不被修改的通常做法是什么?声明该空间的const类型,但是这样真的可以吗?是不是的,由于const空间对象的指针是可以付给一个非const值指针的.所以这仍然无法不让该空间 ...
- JavaScript对象的指向问题
JavaScript对象的指向问题 标签(空格分隔): JavaScript 对象 在接触了JavaScript之后,我们常听到一句话就是一切皆对象,意思是说除了object以外,JavaScript ...
- c++ 动态判断基类指针指向的子类类型(typeid)
我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...
随机推荐
- Xcode的小标记旁边的文件的名称的作用
这两天老板教我要注意Xcode该文件名以小标记权.例如: 这里的M就是Xcode中类名旁边的一个symbol.还有A,D等,这些标记用于显示当前文件和代码仓库中该文件对照后的状态: M = Local ...
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
这篇博客是hibernate学习的第一篇,主要简介hibernate框架,之后简单说一下hibernate的文件夹结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hiberna ...
- Java流
流是一组有顺序的,有起点和终点的字节集合,是对传输数据的总称或抽象.即数据在两设备间的传输称为流,流的本质是传输数据,依据传输数据特性将流抽象为各种类,方便更直观的进行数据操作. 流的分类: 数据类型 ...
- hdu 4115 石头剪子布(2-sat问题)
/* 意甲冠军:石头剪子布,目前已知n周围bob会有什么,对alice限制.供u,v,w:设w=0说明a,b回合必须出的一样 否则,必须不一样.alice假设输一回合就输了,否则就赢了 解: 2-sa ...
- 【Android】Android在AlertDialog使用大全
package com.ceac.deng; import android.R.string; import android.support.v7.app.ActionBarActivity; imp ...
- 完全背包 (DP)
输入: n=3 (w,v)={(3,4),(4,5),(2,3)} W=7 输出: 10(0号物品选1个,2号物品选2个) 和01背包的区别是物品可以任意选择. 令dp[i+1][j]=从前i种物品中 ...
- ASP.NET——两个下拉框来实现动态联动
介绍: 在网页中.我们常常会遇到下图中的情况.首先在下拉框中选择所在的省.选择之后,第二个下拉框会自己主动载入出该省中的市.这样设计极大的方便了用户的查找.那这是怎样实现的呢? 1.建立数据库 &qu ...
- 沃森Mysql数据库修复工具
华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发.主要针对Mysql数据库损坏的恢复. 本程序可用于因为各种误操作而导致数据丢失的恢复,以及因为断电.陈列损坏.硬盘坏道等各种原因导致数据库 ...
- BFS、双向BFS和A*
BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...
- [Linux]使用Clang实现代码静态分析
1.按下开关Clang sudo apt-get install Clang 2.编写测试程序 memleak.c #include<stdio.h> #include<stdli ...