(function () {
var x = 1;
return {
f: function (x) {
alert(x);
}
};
}()).f(2);
假设我不想重命名任何一个变量。从f
开始,无法访问首先声明的变量x
- 对吗?
答案 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.