область литеральных методов объекта

В настоящее время я провожу эксперимент с областью видимости и подъемом в JS. Здесь у меня есть два примера, которые меня смущают по-разному. Сначала я назначил анонимную функцию переменной с именем parent. Очевидно, что возвращенная дочерняя функция имеет доступ к своей внешней области функции. поэтому он может получить доступ к текстовой переменной. Это ясно и просто. Вот код.

var parent = function() {
    var text = 'i can access the container';
    return function() {
        alert(text);
    }
}();
parent();

Позже я хотел вернуть объект вместо функции, у которой есть метод. Этот метод не находится непосредственно в теле немедленно вызываемой функции, а определен внутри возвращаемого объекта. Но он может получить доступ к переменной с именем private, которая содержит строковое значение. Как получилось, что эта переменная находится в области действия этого литерального метода объекта??

var parent = (function() {
    var text = 'private variable';
    return {
        prop: 'i am the property',
        method: function() {
            alert('i can access ' + text);
        }
    }
})();
parent.method();

person AL-zami    schedule 19.10.2014    source источник


Ответы (3)


В JavaScript литералы объектов не создают новые области видимости, а только функции. Таким образом, все переменные, объявленные в IIFE, будут доступны функции method в объектном литерале.

person thefourtheye    schedule 19.10.2014

Литерал объекта может видеть все, что определено в области блока функции, в которой он определен.

person TGH    schedule 19.10.2014

Вот для чего нужны замыкания.

Ваш второй пример можно переписать как:

var parent=(function(){
    var text='private variable',
        fnc = function(){
           alert('i can access ' +text);
        };
    return {
       prop:'i am the property',
       method: fnc
    }
 })();
parent.method();

Or:

var text='private variable',
    fnc = function(){
        alert('i can access ' +text);
    };
var parent=(function(){
    return {
       prop:'i am the property',
       method: fnc
    }
 })();
parent.method();

И очевидно, что вызов parent.method или fnc должен дать один и тот же результат.

person meze    schedule 19.10.2014