Javascript JS-在外部函数之外声明嵌套函数 案例1:我理解为什么它在这种情况下有效: 案例2:但我不明白,如果单独在外部声明bar函数,为什么以下不起作用: 案例3:如果我向bar函数添加参数:
输出:Javascript JS-在外部函数之外声明嵌套函数 案例1:我理解为什么它在这种情况下有效: 案例2:但我不明白,如果单独在外部声明bar函数,为什么以下不起作用: 案例3:如果我向bar函数添加参数:,javascript,function,lexical-scope,Javascript,Function,Lexical Scope,输出: "arg: undefined" "outer variable: " undefined 我的问题是关于案例2:为什么bar()没有到达foo()中定义的变量 编辑案例2: 从所有反馈中学习到,我在栏(arg,outer)中添加了参数,并且效果良好。非常感谢 function foo(arg) { var outer = " this is the outer variable"; bar(arg, out
"arg: undefined"
"outer variable: " undefined
我的问题是关于案例2:为什么bar()
没有到达foo()
中定义的变量
编辑案例2:
从所有反馈中学习到,我在栏(arg,outer)
中添加了参数,并且效果良好。非常感谢
function foo(arg) {
var outer = " this is the outer variable";
bar(arg, outer);
}
function bar(arg, outer) {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
console.log(foo("hello"));
它可以工作。函数参数仅在声明函数内部可见 因此
bar
函数无法访问foo的
参数
您应该将参数传递给foo函数
function foo(arg) {
var outer = " this is the outer variable";
bar(arg); //<-------------
}
function bar(arg, outer) {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
函数foo(arg){
var outer=“这是外部变量”;
bar(arg);//函数参数仅在声明函数内部可见
因此bar
函数无法访问foo的
参数
您应该将参数传递给foo函数
function foo(arg) {
var outer = " this is the outer variable";
bar(arg); //<-------------
}
function bar(arg, outer) {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
函数foo(arg){
var outer=“这是外部变量”;
bar(arg);//因为bar
的词法范围是由它在代码中的位置定义的,而不是由它执行的链条定义的。让我引用维基百科中关于这个主题的内容:
范围界定的一个根本区别是什么是“程序的一部分”
在具有词法范围(也称为静态范围)的语言中,
名称解析取决于源代码中的位置和
词法上下文,由命名变量或
函数是定义的。相反,在具有动态范围的语言中
名称解析取决于使用名称时的程序状态
遇到由执行上下文或调用确定的
上下文
在实践中,对于词汇范围,变量的定义由
搜索其包含的块或函数,如果失败
搜索外部包含块等,而使用动态
搜索调用函数的作用域,然后搜索调用的函数
调用函数,依此类推,使调用堆栈向上扩展
当然,在这两个规则中,我们首先寻找一个
变数
换句话说,如果你在foo
中声明bar
,它的词法范围将包括foo
的词法范围。因为bar
的词法范围是由它在代码中的位置定义的,而不是由执行它的链条定义的。让我引用维基百科关于这个主题:
范围界定的一个根本区别是什么是“程序的一部分”
在具有词法范围(也称为静态范围)的语言中,
名称解析取决于源代码中的位置和
词法上下文,由命名变量或
函数是定义的。相反,在具有动态范围的语言中
名称解析取决于使用名称时的程序状态
遇到由执行上下文或调用确定的
上下文
在实践中,对于词汇范围,变量的定义由
搜索其包含的块或函数,如果失败
搜索外部包含块等,而使用动态
搜索调用函数的作用域,然后搜索调用的函数
调用函数,依此类推,使调用堆栈向上扩展
当然,在这两个规则中,我们首先寻找一个
变数
换句话说,如果您在foo
中声明bar
,它的词法范围将包括foo
的词法范围。无论函数从何处调用,甚至是如何调用,它的词法范围都是仅由函数的声明位置定义的
function foo(arg) {
var outer = " this is the outer variable";
function bar() {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
bar();
}
在这里,bar可以访问外部变量,因为它在其词法范围内,而不是在情况2中。无论函数从何处调用,甚至调用方式如何,它的词法范围都是仅由函数声明的位置定义的
function foo(arg) {
var outer = " this is the outer variable";
function bar() {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
bar();
}
在这里,bar可以访问外部变量,因为它在词法范围内,但不在案例2中
我的问题是关于案例2:为什么bar()没有到达
在foo()中定义的变量
外部
被声明为变量
,这意味着它具有功能范围(在声明它的函数内部可以访问)
因此,在foo
(在bar
中)之外,除非在bar
中或在其父范围内声明它(声明bar
的函数),否则无法访问
来自评论
我假设嵌套函数可以访问内部定义的变量
外部功能
- 混淆似乎源于这样一种想法,
bar
嵌套在foo
-中,这是错误的
function foo(arg) {
var outer = " this is the outer variable";
function bar() {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
bar();
}
bar
对foo
不是私有的,因为它不是在foo
中声明的,所以它与foo
在同一范围内声明
我的问题是关于案例2:为什么bar()没有到达
在foo()中定义的变量
外部
被声明为变量
,这意味着它具有功能范围(在声明它的函数内部可以访问)
因此,在foo
(在bar
中)之外,除非在bar
中或在其父范围内声明它(声明bar
的函数),否则无法访问
来自评论
我假设嵌套函数可以访问内部定义的变量
外部功能
- 孔夫西
function foo(arg) {
var outer = " this is the outer variable";
bar();
}
function bar(arg,outer) {
console.log("arg: " + arg);
console.log("outer variable: ", outer);
}
console.log(foo("hello"));