码迷,mamicode.com
首页 > 其他好文 > 详细

关于this的例子解说:引用高级程序第三版中的代码 this在ECMA中介绍的比较复杂。很多我都没看懂。

时间:2015-07-10 10:55:44      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

 

想要了解THIs的值如何变化的要了解很多知识点。这里我就简单点介绍下this的值如何变化的.
10.1.6 活动对象
当控制进入函数代码的执行上下文时,创建一个活动对象并将它与该执行上下文相关联,
并使用一个名为 arguments、特征为 { DontDelete } 的属性初始化该对象。该属性的初始值是
稍后将要描述的一个参数对象。
接下来,这个活动对象将被用作变量初始化的可变对象。
活动对象纯粹是一种规范性机制,在 ECMAScript 访问它是不可能的。只能访问其成员而
非该活动对象本身。对一个基对象为活动对象的引用值应用调用运算符时,这次调用的 this 值
为 null10.1.7 This
对于每个执行上下文,都有一个 this 值与其相关联。在控制进入执行上下文时,根据调用
者和被执行代码的类型决定这个值。与执行上下文相关联的 this 值是非可变的。

8.7 引用类型
内部引用类型不是语言的数据类型。在本规范中定义它是为了说明要旨。 ECMAScript
现的产生和操作内部属性的行为必须是 这里所描述的方法。而且,类型 Reference 的值仅被 用
于表达式求值的中间值,且不能被对象的属性存储。
引用类型被用于解释诸如 deletetypeof 和 赋值运算符等操作。例如,赋值的左侧操
作数被期望产生一个引用。作为替代,对于赋值运算符的左侧操作数,赋值的行为被用于解释 其整个句法形式的套用分析, 但这对于解释允许函数调用返回引用这个问题有些困难。我们纯
粹是为了宿主对象而允许这种可能性。本规范中定义的非内置的 ECMAScript 函数返回一个引
用,但这里没有为用户定义函数返回引用作准备。(另一个理由是,不使用句法套用分析将会
变得冗长且尴尬,对本规范中许多部分造成影响。)
Reference 是到对象的属性的引用。一个引用由两部分组件组成,基 对象(base object)
性名(property name)
本规范使用下面的抽象操作来访问引用的组件。
GetBase(V)。返回引用 V 的基对象组件。
GetPropertyName(V)
**
引用类型的算法步骤
GetValue (V)
1. If Type(V) is not Reference, return V.
2. Call GetBase(V).
3. If Result(2) is null, throw a ReferenceError exception.
4. Call the [[Get]] method of Result(2), passing GetPropertyName(V) for the property name.
5. Return Result(4).
**
这些英语我就不翻译了哈
//这是ECMA第三版的知识。 下面这个例子简写说明 var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; //这里之所以是全局对象是因为调用函数getNameFunc()return返回的是一个函数对象,在第二次调用返回的这个函数时,ECMA中简说为此函数对象不是一个象不是引用类型值,所以它的基对象为null,其值会被隐式转换为全局对象,然后用此基对象确定this的值。但是在ESC5中此值为undefined,并且不被转换。 }; } }; alert(object.getNameFunc()()); //"The Window"(在非严格模式下)

高三的一个例子
var name = "The Window";
var object = {
name : "My Object",
getName: function(){
return this.name;
}
};
这里的 getName()方法只简单地返回 this.name 的值。以下是几种调用 object.getName()的
方式以及各自的结果。
object.getName(); //"My Object"
(object.getName)(); //"My Object" //分组表达式返回一个值,但是此值并不会用用于getvalue,所以当运用函数调用()解释器会根据ECMA中的函数调用时的一些算法步骤确定this的值,此时的值为基对象object,之所以是此值,是因为算法过程中:如果他是内部引用类型,那么对它GetBase(Reference),得到基对象用它来确定this的值。
(object.getName = object.getName)(); //"The Window",在非严格模式下 //=表达式返回一个函数对象 此对象不是引用类型。所以调用时按照我上面的例子解说的那样。基对象为空。被转成全局,确定this的值。

 

关于this的例子解说:引用高级程序第三版中的代码 this在ECMA中介绍的比较复杂。很多我都没看懂。

标签:

原文地址:http://www.cnblogs.com/cmptlgg/p/4635038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!