为什么不能给同名函数表达式中的变量赋值?
Why can’t I assign values to a variable inside a named function expression with the same name?
这是一个命名为test
的函数表达式。在内部,我将123
赋值给一个同样名为test
的变量。记录test
日志。该函数在控制台中打印其主体,但不打印123
。这种行为的原因是什么?
(function test() {
test = 123;
console.log( test );
}());
我对函数执行的解释失败了吗?
- 函数执行开始:
test
是一个引用函数本身的局部变量 - 局部变量
test
被重新赋值给123
-
console.log(test)
表示123
。
我相信ecma规范的这一部分解释了这种行为。这特别涉及到命名为的函数表达式
生产FunctionExpression: function Identifier (FormalParameterListopt) {FunctionBody}
按如下方式求值:
- 让funcEnv作为调用NewDeclarativeEnvironment的结果,传递正在运行的执行上下文的词法环境作为参数
- 让envRec成为公司的环境记录。
- 调用envRec的CreateImmutableBinding具体方法,传递Identifier的String值作为参数
- 让闭包是创建13.2节中指定的新Function对象的结果,参数由FormalParameterListopt指定,主体由FunctionBody指定。传入funcEnv作为作用域。如果FunctionExpression包含在严格代码中,或者它的FunctionBody是严格代码,则传入true作为Strict标志。
- 调用envRec的InitializeImmutableBinding具体方法,传递Identifier和closure的String值作为参数。
- 返回关闭。
在创建命名函数表达式的作用域时使用CreateImmutableBinding
,将标识符(在本例中为test
)创建为不可变变量。这就是为什么赋值不会改变它的值。
相关文章:
- Javascript变量赋值|
- 如何在javascript中为全局变量赋值
- 我可以在javascript中的回调函数中为变量赋值吗
- JavaScript 变量赋值的行为令人惊讶
- 为什么 Javascript 在变量赋值时将 null 转换为字符串
- JavaScript: 变量赋值 in for 语句 |在前面或里面
- 我可以将变量赋值为数组值吗?
- 变量赋值无效
- 一行中的多个变量赋值
- Javascript中的多变量赋值
- 如何根据 IF 句子和警报为变量赋值?.JS
- 无法为变量赋值 - Javascript
- 为所有以特定字符串开头的变量赋值
- Javascript中多变量赋值的正确方法
- 条件变量赋值的最佳方法
- 在 JavaScript 中是否有一个严格等价的 ||在变量赋值中使用时
- 在 JavaScript 中,未声明的变量赋值可以在函数范围之外访问
- 使用Javascript,变量赋值上下文中的表达式与上下文外的表达式有什么区别
- JavaScript 变量赋值
- 当我为 PHP 变量赋值时,是否可以调用 JavaScript 函数