【问题标题】:What's the scope of javascript named function, passed as parameter作为参数传递的javascript命名函数的范围是什么
【发布时间】:2016-04-29 15:05:41
【问题描述】:

我使用过一些框架,甚至为我自己的目的编写了一些库。我现在正在实现 AngularJs 路由器...并再次查看了 Angular 的 DI:

  1. [...字符串,函数]
  2. function.$inject

长期以来,我一直在使用第一种语法。现在在测试我的路由器时,我想看看两种语法是否不同以及如何处理的行为,但是......

第一手

module.controller(function SampleController()
{
});
// Since it's and `invokelater...` function which is called right away,
SampleController.$inject = [/** my component dependencies **/]

当我面对时看到我的脸:

ReferenceError: SampleController 未定义

另一只手

我觉得写不干净:

function SampleController()
{
}
SampleController.$inject = [];
moddule.$inject = [];

终于

我知道这行不通。 为什么? - 这是我的问题。

为什么?

我们被告知moduleclassmethod/functions、一些for 循环、if...else 创建新范围。

我从来没有读过类似的东西:

函数的参数在它们自己的范围内进行评估

请告诉我

谢谢!

【问题讨论】:

  • 您是否期望 Angular 以某种方式覆盖 Javascript 行为并将您的参数提升到函数体之外?
  • mccainz - 完全没有,只是想说明原因
  • tushar - 那里讨论的问题不一样

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

命名函数表达式只在它们自己的范围内创建一个匹配的变量(这对于递归调用函数很有用)。

它们在包含它们的函数范围内什么都没有创建。

当你将它作为函数参数传递时,你传递给它的变量的作用域就是函数调用。即function function_you_pass_the_function_to(someFunction) { }someFunction 变量限定为自身。

【讨论】:

  • quentin,你有任何链接来支持你的话吗?
  • quentin,请您引用spec 中导致您得出结论的那句话。我正在阅读但没有得到那个具体点 - 或者说不确定得到它
  • 可以从 FunctionExpression 的 FunctionBody 内部引用 FunctionExpression 中的标识符,以允许函数递归调用自身。但是,与 FunctionDeclaration 不同,FunctionExpression 中的标识符不能被引用,并且不会影响包含 FunctionExpression 的范围。
  • 比你Quentin!然而告诉我:除了Identifieropt(ional) 之外,FunctionExpressionFunctionDeclaration 之间有区别吗? ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨ 那么这段代码如何提示一个警告框呢? function hello(friend) { alert('Hello ' + friend); } hello('Quentin'); 因为我是从 outside¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ 期望某处有一个隐藏的句子说明类似 functions as parameters are FunctionExpression
  • “……之间有区别吗”——是的,有很多区别。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多