我正在跟进John Resig 的 JS 忍者秘密幻灯片 http://ejohn.org/apps/learn/#11我发现了一些我不太明白的东西。下面的代码定义了一个命名函数表达式:
var ninja = function myNinja(){
console.log(myNinja); // function myNinja() {...}
};
myNinja; // undefined
正如我所看到的,在当前范围内(假设它是全局的),ninja
是保存对命名函数的引用的变量myNinja
. ninja
变量可以在范围内访问 - 这很清楚,但是myNinja
在作用域中不可访问(但可以在其自己的函数内访问)。怎么会?
如果我定义一个函数(不使用函数表达式,而是使用函数声明):
function Cheese() {
console.log(Cheese);
}
那么它就可以在当前范围内访问。我知道这就是这样的 - 但有人可以解释为什么会这样吗?
在他的书中,JavaScript 忍者的秘密 http://www.manning.com/resig/,John Resig 对这个概念做了精彩的解释。
http://jsninja.com/ http://jsninja.com/
以下是书中的引述:
4.2.4.内联命名函数
<script type="text/javascript">
var ninja = function myNinja(){
assert(ninja == myNinja, "this is named two things at once!");
};
ninja();
assert(typeof myNinja == "undefined",
"But myNinja isn't defined outside of the function.");
</script>
这个清单提出了有关内联的最重要的一点
函数:尽管可以命名内联函数,但这些名称是
仅在函数本身内可见。
还记得我们在第 3 章中讨论过的范围规则吗?排队
函数名的作用有点像变量名,它们的范围是
仅限于声明它们的函数。
3.2.1.范围和功能
变量声明从其声明点起就处于范围内到
声明它们的函数的末尾, 不管
块嵌套。
如果你想更多地了解这个概念,这本书会对你有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)