javascript - 函数可以访问在它自己的父函数中定义的变量吗?
问题描述
Mozilla 的开发人员资源显示了关于函数范围的两个相互矛盾的解释。
这里 表示即使“变量定义在与函数调用相同的范围内”,代码也会抛出错误,因为“它没有在函数定义中定义”。
例子)
function myBigFunction() {
var myValue;
subFunction1();
}
function subFunction1() {
console.log(myValue);
} //this will show a reference error
但是,这里表示“在另一个函数中定义的函数也可以访问在其父函数中定义的所有变量以及父函数可以访问的任何其他变量”。
例子)
function getScore() {
var num1 = 2,
num2 = 3;
function add() {
return name + ' scored ' + (num1 + num2);
}
return add();
} //this is ok
解决方案
在你的第一个例子中
function myBigFunction() {
var myValue;
subFunction1();
}
function subFunction1() {
console.log(myValue);
} //this will show a reference error
这里 myValue 包含在一个函数中myBigFunction()
,因此它具有块作用域。
块范围意味着该块内的任何代码(这里函数定义块)可以使用该变量,如果函数包含另一个函数(函数定义)和使用该变量的内部函数,那么它将在闭包中传递给内部函数。第二种情况与我在这里解释的完全相同。
function getScore() {
var num1 = 2,
num2 = 3;
function add() {
return name + ' scored ' + (num1 + num2);
}
return add();
} //this is ok
在上面的示例中 num1 和 num2 在 function 中声明getScore()
,并且它具有内部函数,add()
因为使用 num1 和 num2 添加函数它将作为闭包传递给add()
函数,并且在访问这些变量时不会出现任何错误。
但在第一个示例中,变量在范围之外被访问,并且作为在该函数之外访问的变量,它将无法访问,并且会引发引用错误。
我希望解释清楚你的理解。要彻底理解它,请通过 JavaScript 作用域和闭包概念。
推荐阅读
- android - com.google.gms:google-services:3.2.0 的 Ionic 3 prod 发布构建问题
- javascript - Azure 功能 JavaScript 中的无头浏览器?
- sql - SQL Server:删除用户
- android - android系统有没有机会在从playstore更新应用程序时自动清除应用程序的数据包括数据库?
- c - 查找右移量以将位索引映射到位数组中的缓冲区索引
- php - Mongo $addToSet 一个数组
- python - python pandas在迭代期间更新与先前更新的行相关的列值
- animation - UIView Draw 方法在动画子层时被多次调用
- mysql - MySQL 语句中的语法错误,无用的错误消息
- javascript - 当我更改光标位置时,防止 textarea 自动滚动