Доступ к переменной во внешней области видимости? - PullRequest
9 голосов
/ 30 декабря 2010
(function () {
    var x = 1;
    return {
        f: function (x) {
            alert(x);
        }
    };
}()).f(2);

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

Ответы [ 5 ]

11 голосов
/ 30 декабря 2010

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

5 голосов
/ 30 декабря 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);
1 голос
/ 30 декабря 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". ; -)

1 голос
/ 30 декабря 2010

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

(function () {
    var x = 1;
    return {
        f: function () {
            alert(this.x);
        },
        x:x
    };
}()).f();
0 голосов
/ 09 апреля 2016

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

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.
...