【发布时间】:2016-06-17 21:14:48
【问题描述】:
我一直认为嵌套的函数调用可以访问它们上面的范围,而不管函数在哪里定义(在下面的示例中,我认为printsomething函数可以访问runeverything 函数中的“某物”变量)。根据下面的小提琴,情况并非如此。函数printsomething 是否必须在外部函数runeverything 中定义(而不仅仅是调用)才能访问在另一个函数runeverything 中定义的局部变量?
这对我来说很重要,因为节点模块在导入时会被提升到顶部。这给我带来了范围界定问题!
function foo(){
function printsomething() {
$('#test').text(something || 'nothing');
};
var something = 'something';
function runeverything() {
printsomething(); //returns "something is not defined"
}
runeverything();
};
foo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1 id="test"></h1>
【问题讨论】:
-
有什么问题?您在测试中发现的是正确的:JavaScript 具有静态词法作用域。声明函数的代码点绝对重要。
-
当模块导入被提升到顶部时,我可以在节点中做什么?当我从模块调用方法时,我必须将所有变量作为选项传递,因为该方法无法访问外部函数的变量。有什么解决办法吗?
-
同样,JavaScript 具有静态词法范围。对此没有“解决方案” - 这是语言的基本性质。
标签: javascript closures local-variables node-modules scoping