Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在哪里可以定义函数_Javascript_Scope - Fatal编程技术网

Javascript 在哪里可以定义函数

Javascript 在哪里可以定义函数,javascript,scope,Javascript,Scope,已编辑:表达式function foo(){return 20;},foo()是指向console.log)的单个参数 这: console.log((函数foo(){return 20;},foo())使用console.log的每个“log”将输出在调用console.log的范围内注册的值 在您的情况下,您正在控制台.log的调用中定义一个函数,该命名函数将仅在其中定义您需要在控制台.log之外定义函数,以便可以输出其值 第二个参数的行为与第一个参数类似,将在全局范围内搜索值。它无法查找第

已编辑:表达式
function foo(){return 20;},foo()
是指向
console.log
)的单个参数

这:
console.log((函数foo(){return 20;},foo())
使用
console.log
的每个“log”将输出在调用
console.log
的范围内注册的值

在您的情况下,您正在
控制台.log的调用中定义一个函数,该命名函数将仅在其中定义您需要在
控制台.log之外定义函数,以便可以输出其值

第二个参数的行为与第一个参数类似,将在全局范围内搜索值。它无法查找第一个参数中定义的值

console.log(function foo() {return 20;}, foo());
在这段代码中,您将一个命名(
foo
)函数作为参数传递给
console.log
。知道了?您从未声明过函数
foo
,您只是将其作为参数传递。在javascript中,函数声明和函数表达式具有相同的语法,因此存在混淆

也就是说,传递一个命名(而不是匿名)函数几乎总是无用的。您的代码与此等效:

console.log(function () {return 20;}, foo());

其中,
function(){return 20;}
是匿名函数,而不是命名函数。匿名函数在JS中非常广泛,因为同样,命名函数表达式中的名称基本上是无用的。

更新

我看到你编辑了原来的问题。由于您实际上只将一个参数传递给
console.log()
,因此我认为在这种情况下,出现引用错误的原因是,当您使用那样的逗号时,该函数语法被视为函数表达式而不是函数声明。因此,它是一个命名函数,但它不是一个声明的函数,并且仍然超出
foo()
表达式的范围

有关声明和语句与表达式的更多信息,请参阅,特别是“函数表达式与函数声明”一节

明确地说,这(在它自己的行上)将是一个函数声明:

function foo() {return 20;})
鉴于这是定义变量并将其分配给命名函数表达式:

在代码中,您实际上创建了一个函数表达式,尽管它看起来像是一个函数声明


函数可以在任何允许使用语句或表达式的地方定义。因此,代码的语法是有效的,但它不起作用,因为表达式的作用域是定义它们的位置。在这种情况下,第二个参数无法访问第一个参数中的
foo
函数。这与使用
let
const
时,在其块外无法访问变量的方式类似,例如:

if (someCondition) {
    const foo = () => 20
    console.log(foo())  // works
}
console.log(foo())  // doesn't work: Uncaught ReferenceError: someCondition is not defined
因此,如果需要在
console.log()
的参数中调用函数,则需要在
console.log()
语句外部声明函数,例如:

function foo() {return 20;}
console.log(foo());
或者,正如其他一些人提到的,您可以使用IIFE(立即调用的函数表达式),因为它不会尝试从
console.log()
的第二个参数位置访问函数(它只涉及一个参数):


……但实际上,这是对生活的拙劣利用;在这里这样做没有意义。

没有回答您的问题,但是在本例中可以使用IIFE
console.log((function foo(){return 20;})()“你从来没有声明函数foo,你只是把它作为参数传递。”-很好地说,命名函数表达式的目的是什么?不一定,你也可以使用iLife并获得想要的结果,例如:
console.log((function foo(){return 20;})()
@DragoşPaulMarinescu是的,你可以,但是它没有用,因为foo没有声明。直接写入控制台日志(20)
function foo() {return 20;}
console.log(foo());
console.log((function foo() {return 20;})())