Javascript 为什么函数语句在将函数设置为方法时不创建函数?

Javascript 为什么函数语句在将函数设置为方法时不创建函数?,javascript,function,Javascript,Function,我遇到了以下行为: > foo = {}; {} > foo.bar = function bar() { return arguments; } [Function: bar] > bar() ReferenceError: bar is not defined at repl:1:2 at REPLServer.self.eval (repl.js:110:21) at Interface.<anonymous> (repl.js:239

我遇到了以下行为:

> foo = {};
{}
> foo.bar = function bar() { return arguments; }
[Function: bar]
> bar()
ReferenceError: bar is not defined
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

但是,如果没有分配到bar,它为什么不能工作?

在分配的RHS中使用function关键字的上下文使其成为一个,而不是一个

在函数和之间放置一个名称,使其成为命名函数,但由于它不是函数声明,因此不会在当前范围内创建变量


请注意,命名函数表达式在old-IE中具有。

在赋值的RHS中使用函数关键字的上下文使其成为,而不是

在函数和之间放置一个名称,使其成为命名函数,但由于它不是函数声明,因此不会在当前范围内创建变量


请注意,命名函数表达式在old-IE中有。当您在该上下文中使用该类型的函数声明时,您正在创建命名函数表达式NFE。当您有一个函数声明时,这与简单地声明一个命名函数形成对比

该规范规定,NFE的名称只能在函数本身内部访问。以下是如何看待差异:

var x = function() { console.log(foo); }      // (anonymous) function expression
x(); // ReferenceError: foo is undefined

var y = function foo() { console.log(foo); }  // NFE
y(); // function foo()...

在该上下文中使用该类型的函数声明时,您正在创建命名函数表达式NFE。当您有一个函数声明时,这与简单地声明一个命名函数形成对比

该规范规定,NFE的名称只能在函数本身内部访问。以下是如何看待差异:

var x = function() { console.log(foo); }      // (anonymous) function expression
x(); // ReferenceError: foo is undefined

var y = function foo() { console.log(foo); }  // NFE
y(); // function foo()...

您实际上是在创建命名函数表达式。因此,它不在当前范围内,而是作为方法分配给对象foo的属性

当在表达式中使用function关键字而不是在没有给出名称的情况下使用声明时,我敢肯定,您已经知道,您创建了一个匿名函数

当在表达式上下文中的function关键字和之间添加名称时,将创建一个命名函数表达式


函数名的作用域在函数本身内部,因此在函数内部,您可以使用bar递归调用自身,但在外部,它不存在,并给出您遇到的引用错误。

您实际上是在创建命名函数表达式。因此,它不在当前范围内,而是作为方法分配给对象foo的属性

当在表达式中使用function关键字而不是在没有给出名称的情况下使用声明时,我敢肯定,您已经知道,您创建了一个匿名函数

当在表达式上下文中的function关键字和之间添加名称时,将创建一个命名函数表达式


函数名的作用域在函数本身内部,因此在函数内部,您可以使用bar递归调用它自己,但在外部,它不存在,并给出您遇到的引用错误。

函数所在的位置不是bar而是foo.barresides@Dalorzo我知道,但这不是函数{…},而是函数条{...}。若要确定此对象的作用域,您需要将函数附加到此对象上的属性,而不是新对象上。您的新对象实际上是附加到此对象上的。@No1_Melman我知道,但我想将函数同时添加到此对象和foo对象。在您的示例中,不要使用this.var,而只使用全局bar变量来限制对命名函数表达式的混淆,例如d不包括的作用,它不是酒吧,但foo.bar在您的职能resides@Dalorzo我知道,但不是函数{…},而是函数条{…}。若要确定此对象的作用域,您需要将函数附加到此对象上的属性,而不是新对象上。您的新对象实际上是附加到此对象上的。@No1_Melman我知道,但我想将函数同时添加到此对象和foo对象。在您的示例中,不要使用this.var,而只使用全局bar变量来限制对命名函数表达式的混淆,例如d不包括什么是函数表达式的角色?有关于这个主题的文档引用吗?MDN并不像在这个问题上那个样是一个好的ressource,它并没有严格区分它们,并在Mozilla的函数语句中添加了什么是函数表达式?有关于这个主题的文档引用吗?MDN并没有那个么好的resso在这个问题上,它没有严格区分它们,并在Mozilla的函数语句中添加了它们