Вы путаете пару разных вещей здесь.
Ваше первое выражение - это выражение функции, не объявление функции:
(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') };
Этот код определяет переменную,x
и назначает ему функцию.Затем функцию можно вызвать с помощью x()
, и функция остается доступной, пока x
находится в области действия.
Ваш первоначальный вопрос:
Какможет ли объект получить доступ к выражению функции?
Что на самом деле не имеет смысла.Объект не может «получить доступ к выражению функции», он просто содержит свойство, которому была назначена функция, в то время как фрагмент вне объекта не сохранил функцию таким образом, чтобы вы могливызвать его.