访问外部范围内的变量?

时间:2010-12-30 13:46:21

标签: javascript closures scope

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

假设我不想重命名任何一个变量。从f开始,无法访问首先声明的变量x - 对吗?

5 个答案:

答案 0 :(得分:11)

正确。由于x中的function (x)不同,因此访问x的任何尝试都将获得该x(最近的范围)。它阻止了对更广范围内任何{{1}}的访问。

答案 1 :(得分:5)

这允许您同时使用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);

答案 2 :(得分:1)

您可以使用以下函数返回变量:

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

答案 3 :(得分:1)

  

无法从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"

当然,你不能拥有一个名为“本地”的内部变量。 ; - )

答案 4 :(得分:0)

意识到隐式异步调用会让您认为无法从外部范围访问变量:

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.