Доступ к переменной во внешней области?

(function () {
    var x = 1;
    return {
        f: function (x) {
            alert(x);
        }
    };
}()).f(2);

Предположим, я не хочу переименовывать ни одну из переменных. Невозможно изнутри f получить доступ к переменной x, которая была объявлена ​​первой, верно?


person feklee    schedule 30.12.2010    source источник
comment
вы можете выставить переменную с помощью метода   -  person hunter    schedule 30.12.2010
comment
Почему вы не хотите переименовывать ни одну из переменных?   -  person strager    schedule 30.12.2010
comment
Параметр x закрывает переменную x. Как и во многих других языках программирования (которые иногда могут быть разрешены, но в этом примере нет).   -  person Felix Kling    schedule 30.12.2010


Ответы (5)


Правильный. Поскольку у вас другой x в function (x), при любой попытке доступа к x будет получен этот (ближайшая область). Он блокирует доступ к любому x в более широком масштабе.

person Quentin    schedule 30.12.2010

Это позволяет использовать одновременно x (1) и x (2).

(function () {
    var x = 1;
    return {
        f: function (x) {
            alert(x); // paramter (=2)
            alert(this.x); // scoped variable (=1)
        },
        x:x
    };
}()).f(2);
person Fenton    schedule 30.12.2010
comment
Интересный подход. Спасибо! Хотя в реальной жизни я не хочу раскрывать это x. - person feklee; 30.12.2010

Вы можете вернуть переменную с помощью функции:

(function () {
    var x = 1;
    return {
        f: function () {
            alert(this.x);
        },
        x:x
    };
}()).f();
person tcooc    schedule 30.12.2010

Невозможно изнутри f получить доступ к переменной x, которая была объявлена ​​первой

Нет, нет. Внутренняя область x скрывает внешнюю область x.

var closure = (function () {
    var local = {};
    local.x = 1;
    return {
        f: function (x) {
            alert(x || local.x);
        }
    };
}());

closure.f(2);  // alerts "2"
closure.f();   // alerts "1"

Конечно, у вас не может быть внутренней переменной с именем «local». ;-)

person Tomalak    schedule 30.12.2010

Зная о неявных асинхронных вызовах, которые заставляют вас думать, что вы не можете получить доступ к переменной из внешней области:

result = {}
jQuery.ajax({ // it is a async call!
    url: "/some/url",
    success: function(data) {
        result = JSON.parse(data);
    }
});

return result; // Result will be still {} because function returns before request has done.
person Oleg Neumyvakin    schedule 09.04.2016