关于JS的This指针

下面讨论一个执行上下文的最后一个属性——this指针的概念。

This指针

A this value is a special object which is related with the execution context. Therefore, it may be named as a context object (i.e. an object in which context the execution context is activated).

this适合执行的上下文环境息息相关的一个特殊对象。因此,它也可以称为上下文对象[context object](激活执行上下文的上下文)。

任何对象都可以作为上下文的this值。我想再次澄清对与ECMAScript中,与执行上下文相关的一些描述——特别是this的误解。通常,this 被错误地,描述为变量对象的属性。 请牢记:

a this value is a property of the execution context, but not a property of the variable object.

this是执行上下文环境的一个属性,而不是某个变量对象的属性

这个特点很重要,因为和变量不同,this是没有一个类似搜寻变量的过程。当你在代码中使用了this,这个 this的值就直接从执行的上下文中获取了,而不会从作用域链中搜寻。this的值只取决中进入上下文时的情况。

顺便说一句,和ECMAScript不同,Python有一个self的参数,和this的情况差不多,但是可以在执行过程中被改变。在ECMAScript中,是不可以给this赋值的,因为,还是那句话,this不是变量。

在global context(全局上下文)中,this的值就是指全局这个对象,这就意味着,this值就是这个变量本身。

var x = 10;

console.log(
  x, // 10
  this.x, // 10
  window.x // 10
);

在函数上下文[function context]中,this会可能会根据每次的函数调用而成为不同的值.this会由每一次caller提供,caller是通过调用表达式[call expression]产生的(也就是这个函数如何被激活调用的)。例如,下面的例子中foo就是一个callee,在全局上下文中被激活。下面的例子就表明了不同的caller引起this的不同。

// "foo"函数里的alert没有改变
// 但每次激活调用的时候this是不同的

function foo() {
  alert(this);
}

// caller 激活 "foo"这个callee,
// 并且提供"this"给这个 callee

foo(); // 全局对象
foo.prototype.constructor(); // foo.prototype

var bar = {
  baz: foo
};

bar.baz(); // bar

(bar.baz)(); // also bar
(bar.baz = bar.baz)(); // 这是一个全局对象
(bar.baz, bar.baz)(); // 也是全局对象
(false || bar.baz)(); // 也是全局对象

var otherFoo = bar.baz;
otherFoo(); // 还是全局对象

如果要深入思考每一次函数调用中,this值的变化(更重要的是怎样变化),你可以阅读本系列教程第10章This。上文所提及的情况都会在此章内详细讨论。

总结(Conclusion)

在此我们完成了一个简短的概述。尽管看来不是那么简短,但是这些话题若要完整表述完毕,则需要一整本书。.我们没有提及两个重要话题:函数(functions) (以及不同类型的函数之间的不同,比如函数声明与函数表达式)与ECMAScript的 求值策略(evaluation strategy) 。这两个话题以后会提到。

时间: 2024-10-24 00:54:00

关于JS的This指针的相关文章

js的this指针(转)

因为发现身边的一些朋友对js的this指针的理解不是很全面.下面本人简单的讲解一下js的this指针的相关内容,仅供需要的朋友学习参考. 简单的,我先用一句话来概括javascript的this.在js里面,this指针代表的是执行当前代码的对象的所有者. 下面举几个简单的例子加以说明: Js的this指针一代码   var name="jonson"; function test(){alert("您好,我的名字叫"+this.name);} test(); 这段

js连续赋值、指针

jq的源码中有很多连续赋值,类似这样的: var a = {n:1}; var b = a; // 持有a,以回查 a.x = a = {n:2}; alert(a.x);// --> undefined alert(b.x);// --> [object Object] 网上有很多解释了,这里我做一下记录而已,化繁为简,比较容易理解的过程是这样的: 给{n:1},{n:2}分别起名个实际持有这两个内存地址的虚拟对象名字,比如:obj1 ->{n:1},obj2->{n:2} 1)

js传函数指针

一个函数可以作为另一个函数的参数. 函数名代表了这个函数的内存地址. 如果想要函数名带参数,可以将调用语句包裹在一个无参数的函数中. 如下所示: //注册单击事件时,要向click里面传一个函数指针. $("#bt1").click(CallWithPara); //再写一个无参函数,将要调用的带有实参的语句包裹在里面. function CallWithPara() { saySth("小苹果."); } //有参的函数 function saySth(sth)

js 数组引用 发现的问题

最近做项目时,要对返回的数据[保存在json数组中]做一次修改,但原数据要保留一次做备用.首先想到,原数据不动,用一个临时的变量来修改,大致模型就是这样: // 原始: a=[1,2,3,4,5,.........]; // 临时: var b = a ; // 操作: b[b.length] = 1 ; 本来觉得是一个很简单的问题.但测试时候发现,并没得到想要的结果.测了很久才找到问题:a数据居然也跟着b的操作一起发生了改变,怎么都想不通.问了同事,貌似他没遇到过,也搞不清楚怎么回事.只好求助

js基础篇(dom操作,字符串,this等)

首先我们来看这样一道题 <div id='foo' class='aa bb cc'></div>写出如何判断此div中是否含有aa(注:aa成立,aaa不成立) 首先,我们一定是取出class里面的这个字符串,然后我们想办法判断出这个字符串里面是否存在aa,并且只有aa. 我给大家提供了三种方法,第一种利用getAttribute方法,第二种利用getElementByClassName,第三种就是正则匹配了. 代码如下: /* ***用getAttribute方法实现 */ v

javascript引用类型指针

看到一个小例子讲了JS的引用指针内容,记录一下: var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x); //undefined console.log(b.x); //[object Object] a.x = a = {n:2}语句的执行顺序? 对{b.x}的输出为何是[object Object]? 分析: var a = {n:1}; //a指向对象{n:1} var b = a; //a与b都指向{n:1} a.x =

快速排序算法原理及其js实现

要说快排的原理,通俗点说就是把一个事情,分成很多小事情来处理,分治的思想. 假设我们现在对"6  1  2 7  9  3  4  5 10  8"这10个数进行排序.首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了).一般选第一个数6作为基准数.接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列: 3  1  2 5  4  [6 ] 9 7  10  8 在初始状态下,数

跪在某度秋招Web前端笔试题下

今晚跑去华工参加百度Web前端的笔试,做完之后交卷,本来感觉是“为之四顾,为之踌躇满志”的.其中一道题目是关于数组的,回来在电脑上面一敲,顿时为自己的智商和知识羞愧了. 多话不说,直接上题目吧.大概是酱紫的: 代码如下,请写出输出的结果. 1 <script> 2 var str = 'john'; 3 var str2 = 'angus'; 4 5 var arr1 = str.split(''); 6 var arr2 = arr1.reverse(); 7 var arr = str2.

不用canvas,打造属于自己的个人时钟

这篇主要来帮助大家打造一款属于自己的时钟,没有用到canvas,因为目前我也不会canvas,一直想学,却迟迟没有落实.还是老规矩先上成品图吧!有图有真相 怎么样还不错吧,下面就来告诉大家,如何一步步实现. 首先我们按照如下组织我们的HTML架构 <div class="outer"> <div class="middle"> <div class="inner"></div> </div&g