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的变量声明表达式..
分享到:
相关推荐
函数形参是C++函数学习中一大重点,经常让初学者头疼,这里我们通过讲解两个实参值互换的例子讲解实参与形参间的关系,并比较普通变量、指针以及引用作形参时的区别,了解地址、名称以及值间的联系,体会指针、引用...
- 形参(Formal Parameters)是函数定义时声明的变量,它们是函数内部用来接收值的占位符。 - 实参(Actual Parameters)是调用函数时提供的具体值,它们会赋值给形参。 3. **对象作为参数** 当一个对象作为参数...
在VB(Visual Basic)编程语言中,形参(Formal Parameters)是函数或过程定义时声明的参数,用于接收调用函数或过程时传递的实际参数(Actual Parameters)。本实例将探讨如何使用VB变量作为形参,以实现更灵活的...
面向对象程序设计,即c++语言。类,函数的形参、返回值为不同情况时,复制构造函数的调用。内有详细的注释说明。
从大到小输出不小于x的结点元素(注意:其中用了visit函数作为函数的形参)
数组与函数(形参是指针).c
在C/C++语言中,`main`函数是程序执行的入口点,而将指针作为`main`函数的形参(形式参数)则是一种常见的实践,特别是在处理命令行参数时。本主题主要围绕如何使用指针作为`main`函数的形参进行阐述。 `main`函数...
数组做函数的形参,执行过程数组里的值变了 C/C++
在函数调用时,实参可以是变量、常量、表达式或函数调用,而形参则是函数定义中的变量名称。 在函数调用时,实参可以按值传递、按引用传递或按指针传递。按值传递时,函数将实参的副本传递给形参,而不影响实参的...
本文档在某知名网站下载,要么浏览量最多,要么最新,保证精品,至少为你节约3RMB。格式为caj或者kdh需要专业阅读器打开。
由于`process2DArray`的形参`arr`被声明为`int (*arr)[cols]`,它将接收一个指向数组首元素的指针,这与二维数组的行首地址相匹配。因此,即使`arr`实际上是一个指针数组,函数内部仍然可以正确地遍历和处理二维数组...
全局变量可以在任何函数中使用,但需要使用extern关键字进行声明。全局变量的存储类别可以是外部变量(extern)、静态变量(static)或自动变量(auto)。 在C语言中,变量的存储类别和作用域是息息相关的。变量的...
在函数内部使用全局变量时,通常不需要再次声明,除非有同名的局部变量。 2. **局部作用域(Local Scope)**:局部变量在函数内部定义,仅在该函数内部可见。函数调用结束后,局部变量的存储空间会被释放,它们的值...
- **形参变量**(形式参数):是在定义函数时声明的参数,用于接收实参变量传递过来的值。 C语言中的函数参数传递采用的是“值传递”,这意味着在调用函数时,实参的值被复制到形参中,而不是实参本身被传递过去。...
总结而言,了解并掌握函数的声明与定义、形参与实参的对应规则、递归调用的实现方式以及变量的作用域和生存周期等内容对于高效编程至关重要。这些基础知识不仅有助于提升代码质量和可维护性,还能帮助开发者更好地...
在C语言编程中,函数形参是函数定义中声明的变量,用于接收函数调用时传递的参数。在函数形参中,指针类型的参数传递是一种常见的参数传递方式。指针类型的参数传递可以将数据的地址传递给函数,从而在函数中对数据...
因此,当函数内部改变形参(形式参数,如x、y)的值时,这些改变不会影响到实参的值。在Exchg1函数中,虽然函数内部完成了x和y的交换,但因为x和y只是a和b的副本,所以外部的a和b值并没有变化。这就是为什么程序输出...
局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量...
另外,函数定义中的普通形参由于只能在本函数内部使用,因此也是局部变量。 二、全局变量 全局变量是指在函数外部定义的变量,其作用域从变量定义处开始,到本程序文件末尾结束。此处需注意,函数中的局部变量会屏蔽...