【发布时间】:2013-07-03 11:23:59
【问题描述】:
我正在关注John Resig's Secrets of JS ninja slides,但我发现了一些我不清楚的地方。以下代码定义了一个命名函数表达式:
var ninja = function myNinja(){
console.log(myNinja); // function myNinja() {...}
};
myNinja; // undefined
如我所见,在当前范围内(假设它是全局的),ninja 是保存对命名函数myNinja 的引用的变量。 ninja 变量可在范围内访问 - 这很清楚,但 myNinja 在范围内不可访问(但可在其自己的函数内访问)。怎么会?
如果我定义一个函数(不是使用函数表达式,而是函数声明):
function Cheese() {
console.log(Cheese);
}
那么它可以在当前范围内访问。我知道这只是这样工作 - 但有人可以解释为什么会这样吗?
【问题讨论】:
-
"有人能解释一下为什么会这样吗" 如果你问这个设计决定的原因,你应该联系从事 ECMAScript 标准工作的人。
-
@FelixKling 嗨,再见!你是从我的问题中复制评论吗?
-
@FelixKling 好吧,这与设计决策无关 :) 我只是想了解这个概念在内部是如何运作的,而不是为什么 ECMA 中的某个人喜欢这个概念 ;)
-
@tkoomzaaskz:这样的话,你可以在规范中找到技术解释:es5.github.io/#x13。它明确表示:“
FunctionExpression中的Identifier可以从FunctionExpression的FunctionBody内部引用,以允许函数递归调用自身。但是,与FunctionDeclaration不同,FunctionExpression中的Identifier不能被引用,并且不影响包含FunctionExpression的范围。"
标签: javascript function