В первом примере вы объявляете копию содержимого элемента массива в переменной local :
var item = items[i];
Как говорится во встроенном комментарии, здесь мы запоминаем значение в области закрытия.
Во втором примере вместо передачи i
в качестве параметра вы могли бы также сделать:
(function() {
var prop = i; // See here!
console.log("property: " + i);
// Create a nwe getter for the property
that["get" + prop] = function() {
return properties[prop];
};
// Create a new setter for the property
that["set" + prop] = function(val) {
properties[prop] = val;
};
})();
Что делает оба примера более похожими.
Аналогичным образом, вы также можете изменить первый пример, передав ему i
в качестве параметра, вместо того, чтобы подробно описывать его в переменной.
(function(item) {
// Bind a function to the element
obj["on" + items[item] = function() {
// item refers to a parent variable that has been successfully
// scoped within the context of this loop
alert("thanks for your " + items[item]);
};
})(i);
Это произвольно в отношении того, объявляете ли вы локальную копию переменной, используя оператор var
, или передаете ее в качестве параметра в вашу самореализующуюся функцию.
Edit:
@ Zecc скупил хороший комментарий в комментариях, который я хотел бы объяснить:
(function (i) {
// using `i` works as expected.
}(i));
Где как:
(function () {
var i = i;
// using `i` doesn't work... i = undefined.
}());
Это потому, что оператор var variable = value
действительно:
(function () {
var i;
i = i;
}());
и ключевое слово var
всегда присваивает переменной (переменным) после нее значение undefined
.