Javascript 函数能否访问在其自己的父函数中定义的变量?
Mozilla的开发者资源显示了关于函数范围的两种相互矛盾的解释 指示即使“变量定义在与函数调用相同的范围内”,代码仍将抛出错误,因为“它未在函数定义内定义” (示例) 但是,表示“在另一个函数中定义的函数也可以访问其父函数中定义的所有变量以及父函数有权访问的任何其他变量” (示例)Javascript 函数能否访问在其自己的父函数中定义的变量?,javascript,function,variables,scope,Javascript,Function,Variables,Scope,Mozilla的开发者资源显示了关于函数范围的两种相互矛盾的解释 指示即使“变量定义在与函数调用相同的范围内”,代码仍将抛出错误,因为“它未在函数定义内定义” (示例) 但是,表示“在另一个函数中定义的函数也可以访问其父函数中定义的所有变量以及父函数有权访问的任何其他变量” (示例) 第一个示例失败而第二个“有效”的原因与范围和结束有关。您可以将函数的“花括号”视为围绕其作用域或影响范围的包围 第一个示例失败,因为子函数1()的作用域无法访问myBigFunction()的变量myBigFun
第一个示例失败而第二个“有效”的原因与范围和结束有关。您可以将函数的“花括号”视为围绕其作用域或影响范围的包围 第一个示例失败,因为
子函数1()
的作用域无法访问myBigFunction()
的变量myBigFunction()
也不会包装子函数1(),这将提供一个闭包
但是,
add()
是在getScore()
函数的范围内声明的getScore()
“包装”add()
-提供一个闭包,以便add()
可以访问getScore()
范围内的变量。第一个示例失败而第二个“有效”的原因与范围和闭包有关。您可以将函数的“花括号”视为围绕其作用域或影响范围的包围
第一个示例失败,因为子函数1()
的作用域无法访问myBigFunction()
的变量myBigFunction()
也不会包装子函数1(),这将提供一个闭包
但是,add()
是在getScore()
函数的范围内声明的getScore()
“包装”add()
-提供一个闭包,以便add()
可以访问getScore()
范围内的变量。在第一个示例中
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是在函数getScore()
中声明的,它具有内部函数add()
,因为add函数使用num1和num2,它将作为闭包传递给add()
函数,访问这些变量时不会出现任何错误
但在第一个例子中,变量的访问超出了范围,当变量在该函数之外访问时,它将无法访问,并且会抛出引用错误
我希望解释清楚你的理解。要彻底理解它,请浏览JavaScript作用域和闭包概念。在第一个示例中
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是在函数getScore()
中声明的,它具有内部函数add()
,因为add函数使用num1和num2,它将作为闭包传递给add()
函数,访问这些变量时不会出现任何错误
但在第一个例子中,变量的访问超出了范围,当变量在该函数之外访问时,它将无法访问,并且会抛出引用错误
我希望解释清楚你的理解。要彻底理解它,请浏览JavaScript作用域和闭包概念。使用
this
关键字获取父变量,即
var bar = function () {
this.foo = "example";//the only catch is you have to have the this key word when defining the term.
var subfunction = function () {
this.foo = "This an example!";
}
}
(希望这有帮助!)使用
this
关键字获取父变量,即
var bar = function () {
this.foo = "example";//the only catch is you have to have the this key word when defining the term.
var subfunction = function () {
this.foo = "This an example!";
}
}
(希望这有帮助!)两者并不矛盾,但实际上是互补的。变量作用域与此函数类似。两个示例的变量都在父函数中声明,尽管在第一个示例中没有父函数。父函数是封装函数的函数。在第一个示例中,定义了两个独立的函数。
subFunction1()
仅在父函数内调用,并在父函数外定义。定义的函数签名是函数
子函数1(){…
那么,公平地说,函数定义的声明位置很重要吗?两者并不矛盾,但实际上是互补的。变量作用域与此函数类似。虽然在第一个示例中没有父函数,但两个示例的变量都在父函数中声明。父函数是封装函数。在第一个示例中,定义了两个单独的函数。subFunction1();
仅在父函数内调用,在父函数外定义。定义的函数签名是function
subFunction1(){…
那么,公平地说,函数定义的声明位置很重要吗?这两个示例之间的唯一区别不是调用函数“add()”吗?它们都显示父函数中包装的内部函数。第一个示例没有显示任何“包装”。第一个示例简单地调用其作用域内的另一个函数。区别在于定义。由于子函数1()
未在myBigFunction()
中定义,因此它没有访问权限。当您说“包装”,你的意思是声明函数的定义吗