例如:
(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中访问函数表达式,而不能在全局对象中访问?
编辑:凝聚力和清晰度
答案 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 却无法保留函数调用它。