javascript中嵌套函数变量作用域的澄清
Clarification on nested function variable scope within javascript
这似乎是一个已经问过几次的话题,但我真的很难找到一个简洁的解释。我能找到的最接近的是这个(JavaScript中变量的作用域是什么?),但有几个方面我仍然不太理解。正如你可能已经猜到的,我对javascript相当陌生,但这方面似乎是至关重要的,以充分理解,如果我要得到任何地方与它。
那么考虑一个由几个嵌套函数组成的程序:
function functionA() {
var functionAVariable = "A";
}
function functionB() {
var functionBVariable = "B";
}
function functionC() {
var functionCVariable = "C";
function functionD() {
var functionDVariable = "D";
}
}
var globalVariable = "G";
var mainFunction = function () {
var mainFunctionVariable = "M";
functionA();
functionB();
functionC();
};
根据我的理解,所有函数都可以访问globalVariable
和functionA
, functionB
和functionC
可以访问mainFunctionVariable
。
当我们像functionD
一样在整个程序中添加更深的巢时,我开始感到有点困惑。functionD
是否可以访问当前包装它的所有高级函数变量,还是只能访问直接父变量functionC
?
正确根据我的理解,所有函数都可以访问
globalVariable
和functionA、functionB和functionC都可以访问mainFunctionVariable。
。只有分配给mainFunction
的匿名函数才能访问mainFunctionVariable
。作用域由函数创建的位置决定,而不是调用的位置。
我开始感到有点困惑的是,当我们在整个程序中添加更深的巢时,就像使用functionond一样。functionond是否可以访问当前包装它的所有高级函数变量,或者它只能访问直接父变量functionC?
函数可以访问自己作用域中和更大作用域中的所有变量(除非它们被另一个同名变量掩盖)。
var x = 1;
function a() {
var y = 2;
function b() {
var z = 3;
function c() {
alert([x, y, z]);
}
c();
}
b();
}
a();
变量的作用域仅适用于声明该变量的函数本身。如果我们需要访问一个函数的变量到另一个函数,那么我们必须将它作为我们需要访问的函数的参数传递,否则我们必须创建全局变量,全局变量在脚本的所有函数中都是可访问的。
在上面的例子中
functionAVariable is accessible only in functionA,
functionBVariable is accessible only in functionB and
functionCVariable is accessible only in functionC.
functionD
中不能访问functionCVariable
, mainFunctionVariable
只能在mainFunction
中访问。mainFunctionVariable
在functionA, functionB, functionC
中不可访问。
变量globalVariable
在所有函数中都是可访问的。
如果你声明变量时没有指定任何datatype
,比如var
,那么它默认被视为全局变量。比如我们输入functionA
,比如
function functionA() {
var functionAVariable = "A";
globVariable = 10;
}
在上面的代码片段中,functionAVariable
只能在functionA
中访问,但globVariable
现在表现得像全局变量。
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量