javascript中的命名函数与未命名函数以及理解分配
Named vs unnamed functions in javascript and understanding allocation
当你查看 ECMAScript 6 规范时,我注意到了一些有趣的东西。
13 函数定义
语法
FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression : function Identifieropt (FormalParameterListopt ) { FunctionBody }
这两种不同的声明类型进一步细分为以下语义定义:
生产
FunctionExpression : function ( FormalParameterListopt ) { FunctionBody }
评估如下:返回创建新
Function
对象的结果,如 中指定 13.2 参数由FormalParameterListopt
指定,主体由FunctionBody
指定。通过LexicalEnvironment
将执行上下文作为范围运行。传入true
作为Strict
标志(如果FunctionExpression
包含在strict
代码中) 或者如果其FunctionBody
是strict
代码。
和:
生产
FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }
实例化如下 在声明绑定实例化 (10.5) 期间:返回创建新
Function
对象的结果,如 中指定 13.2 参数由FormalParameterListopt
指定,主体由FunctionBody
指定。通过VariableEnvironment
将执行上下文作为范围运行。传入 true 作为Strict
标志,如果FunctionDeclaration
包含在strict
代码中,或者如果 它的FunctionBody
是strict
代码。
我是否正确地将其解释为声明
function foo(){};
"函数表"中声明,其中所有参数和变量在加载执行上下文时在堆栈上分配,而
function (){};
那一刻之前基本上不存在,其所有变量和范围都继承自有问题的本地执行上下文?
或者通俗地说,命名声明被预先分配,匿名声明在"运行时"分配?
这里的重要性不在于命名函数和未命名函数之间的区别,而在于FunctionDeclaration
与FunctionExpression
的区别。
函数声明采用以下形式:
function foo() {...}
请注意函数关键字的位置,其前面没有运算符。 此样式hoisted
到当前上下文的顶部,在运行时可用,允许您执行以下操作:
foo();
function foo() {console.log("Foo was called");}
另一方面,如果在function
关键字(如 =
或 (
)前面放置任何类型的运算符,它就会变成函数表达式。 函数表达式在计算之前不可用。
foo(); // can't call it it here. `foo` exists due to hoisting, but it is `undefined`
var foo = function() {console.log("foo was called");}
foo();
"FunctionDeclaration"是一个语句,而"FunctionExpression"是一个表达式。
函数声明语句和函数表达式之间的最大区别在于函数对象何时实例化,因此,此函数可以使用什么范围。
函数标识符("name")是语句的要求,对于表达式是可选的。
在这两种情况下,函数仅在调用时执行,但作为脚本静态分析的一部分进行解析 - 例如,如果函数表达式包含无效语句,则会引发解析错误,并且脚本不会执行。
- 如何在jQuery中将链接函数分配给变量
- 如何在不使用javascript执行的情况下为函数分配参数
- Javascript从函数分配属性
- 将JavaScript函数分配给提交按钮,该按钮应有条件执行
- 将 jQuery 函数分配给变量不起作用,但包装它不起作用
- 通过参数将传递的函数分配给动态创建的输入类型的onclick事件
- 如何将printThis插件函数分配给按钮
- Javascript-将函数分配给变量dos'不能按预期工作
- 将函数分配为原型函数的属性
- JavaScript 将函数分配给变量而不运行它
- 是否将函数分配给变量的区别
- q 从 .then 函数分配给更高级别的作用域变量是否存在任何陷阱
- JavaScript 将函数分配给对象属性
- 为 jQuery 函数分配多组参数
- 在 JavaScript 中将同一函数分配给多个变量时出现性能问题
- 使用eval使用字符串输入按名称将函数分配给变量有什么风险
- 如何将函数分配给在页面加载后动态添加的元素
- 为什么在模块模式中将函数分配给变量
- 将异步函数及其回调函数分配给单个变量
- 我无法为我的 jquery 函数分配鼠标悬停事件