Javascript 对象如何访问函数表达式?

Javascript 对象如何访问函数表达式?,javascript,scope,Javascript,Scope,例如: (函数foo(){ var a=3; 控制台日志(a); }); var obj={ 答:(函数foo(){ var a=2; 控制台日志(a); }) }; obj.a();//2. foo();//引用错误:未定义您在这里混淆了一些不同的东西 第一条语句是函数表达式,不是函数声明: (function foo() { var a = 3; console.log(a); }); 这恰好是一个命名函数表达式(“foo”),但它没有在此范围内引入变量foo。如果您想引入foo

例如:

(函数foo(){
var a=3;
控制台日志(a);
});
var obj={
答:(函数foo(){
var a=2;
控制台日志(a);
})
};
obj.a();//2.

foo();//引用错误:未定义
您在这里混淆了一些不同的东西

第一条语句是函数表达式,不是函数声明:

(function foo() {
  var a = 3;
  console.log(a);
});
这恰好是一个命名函数表达式(“foo”),但它没有在此范围内引入变量
foo
。如果您想引入
foo
,以便再次调用它,则需要函数声明

function foo() {
  var a = 3;
  console.log(a);
}

foo();
或者,您需要将函数表达式指定给变量:

var foo = function () {
  var a = 3;
  console.log(a);
}

foo();
下一段代码,对象声明,通过将函数表达式赋值给变量,
obj.a
,有效地实现了这一点:

var obj = {
  a: (function foo() {
    var a = 2;
    console.log(a);
  })
};
您在这里思考的错误是由于对
foo
的混淆。在这两种情况下,
foo
是函数的名称,但它实际上与调用函数无关。你应该放下
foo
,因为它只会让人困惑

本质上,您的第一个代码片段相当于:

(function () { alert('x'); });
var x = function () { alert('y') };
这行代码定义了一个匿名函数,但不使用它。函数短暂存在,从未被调用,然后丢失,因为它没有分配给任何对象

您的第二个代码段相当于:

(function () { alert('x'); });
var x = function () { alert('y') };
此代码定义一个变量
x
,并为其分配一个函数。然后可以使用
x()
调用该函数,只要
x
在范围内,该函数就保持可用


你原来的问题是:

对象如何访问函数表达式


这真的没有道理。该对象无法“访问函数表达式”,它只包含一个已分配函数的属性,而对象外部的代码段没有以允许您调用函数的方式保留该函数。

我认为您在这里混合了两种情况。函数的第一部分是一个生命周期,它只运行一次。您无法通过尝试调用该函数来触发该函数再次手动运行。您编写的第二个代码是一个内部有函数的对象,它将工作,因为它在执行过程中存在。IIFE只运行一次,因此当您调用foo()时,它将不会调用该IIFE,并将给您提供引用错误。由于错误已纠正,obj.a将不会成为一个方法。。。。它是未定义的。@Christopher--不,在对象中,您已将IIFE分配给属性。属性的值是IIFE的返回值,该值未定义,因为它只返回doing console.log,不返回任何内容。所以obj.a是未定义的。总要想,生命一旦被定义,就会立即执行。Obj.a持有函数执行的返回值。我想我现在明白了。本质上,foo相当于我们可以附加到匿名表达式以调用它的变量。这意味着,因为我在对象中声明了一个变量,并向其附加了一个函数表达式,所以它可以检索表达式的返回值,就像一个匿名函数中的变量可以检索返回值一样,即使该变量没有引用函数的名称。我认为过度使用会让事情变得混乱函数表达式。函数表达式只是计算为函数的表达式,返回的函数要么保留,要么不保留。如果你保留它,你可以叫它。我理解。我没有想到命名函数的“命名”部分等同于变量。基本上,我不能从全局对象调用foo,因为全局对象中没有一个变量可以找到它,但只要我将它附加到全局范围内的标识符上,我就可以保留它的值。命名函数表达式的名称部分并不等同于变量。这可能会让您感到困惑:
function foo(){}
是一个函数语句,而不是一个表达式,它在该范围内定义了一个变量
foo
,您可以使用该变量调用函数
(function foo(){})
是一个命名函数表达式,它没有在该范围内定义
foo
。除非您将
(function foo(){})
赋值给变量,即
var x=(function foo(){})
,否则您将丢失它;函数a(){…};抱歉把这些废话弄混了。