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

时间:2019-02-22 04:43:36

标签: javascript scope

例如:

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

var obj = {
  a: (function foo() {
    var a = 2;
    console.log(a);
  })
};

obj.a(); // 2
foo(); // ReferenceError: Not Defined

我如何才能在obj中访问函数表达式,而不能在全局对象中访问?

编辑:凝聚力和清晰度

1 个答案:

答案 0 :(得分:0)

您在这里混淆了一些不同的事情。

您的第一个语句是函数表达式,不是函数声明:

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

这恰好是一个以命名的函数表达式(“ foo”),但 not 并没有在此范围内引入变量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') };

此代码定义了一个变量x,并为其分配了一个函数。然后可以使用x()调用该函数,并且只要x在范围内,该函数就保持可用。


您最初的问题是:

  

对象访问函数如何表达?

这没有什么意义。对象无法“访问函数表达式”,它仅包含已分配了函数的属性,而对象外部的代码段 not 却无法保留函数调用它。