Franky 11:13:16
附上我的 笔记:
变量实例化(Variable Instantiation):(初始化执行上下文环境阶段)
每个执行环境都有一个相关联的变量对象(variable object).用来维护变量和函数的声明的标识符. 他们被当做变量对象的属性(property),添加到该对象上. 对于函数执行环境来说,形式参数也同变量声明一样被当做属性,添加到该对象上.
什么对象被当做变量对象来使用,以及该对象相关属性具备哪些特性.是由可执行代码的类型决定的.
.对于函数代码(function code) :
对于每个形参来说,同样会在变量对象上创建一个属性名与形参名(标识符)相同的属性. 这些属性的特性同样由代码类型决定. 这些参数的值由函数调用者提供.
如果函数调用者,提供的实参数量少于形参数量,余下的形参的值就是undefined.
如果有两个或多个形参同名,则由最后一个使用此名的形参对应的实参,向变量对象对应属性提供值,如果无对应实参,则对应属性值为undefined.(即该形参的值为undefined).
.对于代码中的每个函数声明(FunctionDeclaration)语句来说 :
按照源码文本的顺序,以函数标识符(函数名)作为属性名,来建立对应变量对象的属.性.并把同时创建的函数对象作为该属性的值. 这些属性的特性由代码类型决定.
如果变量对象已经具备一个同名的属性,则覆盖掉原来的.
出于语义化的考量, 这个步骤必须在形式参数列表对象(本意应该是指,对应形参标识符的 变量对象的属性创建过程)创建之后. (注1)
.对于代码中的每个变量声明语句,或语句中不包含 in 运算符的变量声明来说
For each VariableDeclaration or VariableDeclarationNoIn in the code)(注2)
根据变量标识符(变量名) ,为变量对象创建对应的属性.属性值为 undefined. 这些属性的特性由代码的类型决定.
如果变量对象已经具备一个同变量标识符同名的属性,则该属性不做任何改变.包括特性.
所以,如果一个声明的变量名和一个函数名或者形参重名,那么这个变量的声明并不影响变量对象已经存在的对应属性以及该属性的特性.(这一点和函数名相反.)
(即特指函数声明和形参的优先级,高于变量声明 . 根据,函数声明语句的说明,我们得出 函数声明 > 形参 > 变量声明的结论)
Franky 11:16:02
注1 . Edition5中,对标识符初始化的过程描述,细节上虽然有很大差异.但最终的流程却是统一的, 即 先做形参初始化(包括arguments的初始化), 然后是函数声明,最后才是变量声明. 优先级也雷同.
所谓语义化的考量. 即如下情况:
void function(fn){
function fn(){};
alert(typeof fn)// function.
}();
即,考虑开发者对函数形参和函数声明语句中的标识符的期待. 这种期待是一种语义上的诉求. 即函数声明.具备最高优先级.
但是下面的代码,会很让人诧异:
function test(fn){
function fn(){}
alert(fn );
}
test(123);
测试结果:
Firefox1.5- 打印 123
其他浏览器 打印 fn函数的字符串表示
仅仅参考这里是无法知道 什么叫做,函数名的初始化过程要在 参数列表对象创建之后. 参考 13.2.1章节 的函数调用的具体步骤可看出:
1. Establish a new execution context using F's FormalParameterList, the passed arguments list, and the this value as described in 10.2.3
2. Evaluate F's FunctionBody.
第一步就是创建新的执行环境,并使用该函数被调用时候,调用者提供的参数列表创建形参列表. 然后第二部才是执行函数体内的语句.所以说,局部函数声明,的初始化过程要在形参初始化之后.而形参初始化时,其对应的实参值,就已经被相应的写入到variable object上去了. 所以函数声明时,会覆盖掉形参,而不是形参对应的实参会覆盖函数声明.
那么我们可以看出,早期的Firefox对标准理解有错误.其他浏览器都是OK的
注2 . ExpressionNoIn ....etc 都是指语句、或表达式 中不包含 in 运算符的形式. 在注释2中的 VariableDeclarationNoIn 特指 如 for (var o in obj) 语句中 ,var o in obj部分 就属于一个 非NoIn的变量声明表达式..
分享到:
相关推荐
js函数形参形参接收object变量.docx
函数形参是C++函数学习中一大重点,经常让初学者头疼,这里我们通过讲解两个实参值互换的例子讲解实参与形参间的关系,并比较普通变量、指针以及引用作形参时的区别,了解地址、名称以及值间的联系,体会指针、引用...
对C语言中函数浮点形参的分析研究,李震平,李海颖,在使用Turbo C语言开发程序时,并非需要将函数的形参float类型数据进行转换为double,也并非Turbo C在处理此类问题时存在缺陷和错误。本��
面向对象程序设计,即c++语言。类,函数的形参、返回值为不同情况时,复制构造函数的调用。内有详细的注释说明。
VB 变量做形参实例 VB 变量做形参实例 VB 变量做形参实例
从大到小输出不小于x的结点元素(注意:其中用了visit函数作为函数的形参)
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中,具体应用如下: 一、 用指向变量的指针作函数参数 使用指针变量作函数参数,在被调用函数中改变...
数组与函数(形参是指针).c
数组做函数的形参,执行过程数组里的值变了 C/C++
本文档在某知名网站下载,要么浏览量最多,要么最新,保证精品,至少为你节约3RMB。格式为caj或者kdh需要专业阅读器打开。
(2) 掌握函数实参与形参的对应关系以及“值传递”、“地址传递”的方式; (3) 掌握函数的嵌套调用和递归调用的方法; (4) 掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。 二、实验内容和步骤 I....
动态创建指针数组,将指针数组作为实参调用形参为二维数组的函数。
通常我们使用的main函数都是不用带形参的,但其实main函数也是可以带形参的
局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量...
另外,函数定义中的普通形参由于只能在本函数内部使用,因此也是局部变量。 二、全局变量 全局变量是指在函数外部定义的变量,其作用域从变量定义处开始,到本程序文件末尾结束。此处需注意,函数中的局部变量会屏蔽...
函数调用结束返回主调函数后则不能再使用该形参变量。 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、...
(1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按...
若只需要利用形参实现对实参值的拷贝,函数体操作形参时与实参无关,则应把形参 变量说明为( )参数。 A指针 B引用 C值 D指针引用 7.下面程序的时间复杂性的量级为()。 int i=0,s1=,s2=0; while(i++) {if (i...
本文以实例阐述了C++中形参与实参的区别,有助于读者加深对于C++... 函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它
这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值。 参数在函数定义的圆括号对内指定,用逗号分割。当我们调用函数的时候,我们以同样的方式提供值。注意我们使用过的术语...