标签:
想要了解THIs的值如何变化的要了解很多知识点。这里我就简单点介绍下this的值如何变化的. 10.1.6 活动对象 当控制进入函数代码的执行上下文时,创建一个活动对象并将它与该执行上下文相关联, 并使用一个名为 arguments、特征为 { DontDelete } 的属性初始化该对象。该属性的初始值是 稍后将要描述的一个参数对象。 接下来,这个活动对象将被用作变量初始化的可变对象。 活动对象纯粹是一种规范性机制,在 ECMAScript 访问它是不可能的。只能访问其成员而 非该活动对象本身。对一个基对象为活动对象的引用值应用调用运算符时,这次调用的 this 值 为 null。 10.1.7 This 对于每个执行上下文,都有一个 this 值与其相关联。在控制进入执行上下文时,根据调用 者和被执行代码的类型决定这个值。与执行上下文相关联的 this 值是非可变的。
8.7 引用类型
内部引用类型不是语言的数据类型。在本规范中定义它是为了说明要旨。 ECMAScript 实
现的产生和操作内部属性的行为必须是 这里所描述的方法。而且,类型 Reference 的值仅被 用
于表达式求值的中间值,且不能被对象的属性存储。
引用类型被用于解释诸如 delete、typeof 和 赋值运算符等操作。例如,赋值的左侧操
作数被期望产生一个引用。作为替代,对于赋值运算符的左侧操作数,赋值的行为被用于解释 其整个句法形式的套用分析, 但这对于解释允许函数调用返回引用这个问题有些困难。我们纯
粹是为了宿主对象而允许这种可能性。本规范中定义的非内置的 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