Как говорил @Джон Хартсок, ответ, который все должны помнить, таков:
var c="hello";
(function(b){
alert(b)
})(c);
И это очень важно, например, в цикле for
, когда внутри него есть какая-то асинхронная функция, потому что в противном случае вы не получите правильный элемент.
Скажи мне, что выходит отсюда?
for (var i=0; i<5; i++){
setTimeout(function(){
console.log(i);
}, 1000);
}
Точно: все 5, потому что когда все таймеры срабатывают через 1 секунду, переменная i
уже имеет значение 5
.
Но если вы используете анонимную функцию, вызываемую самостоятельно (SIAF), как это
for (var i=0; i<5; i++){
(function (j){
setTimeout(function(){
console.log(j);
}, 1000);
})(i);
}
он работает, так как каждый раз, когда вызывается функция, он запускает другой экземпляр функции и, как любая функция, имеет свои собственные локальные переменные. Я не просто определяю функцию, я также запускаю ее сразу (через ();
в конце), но затем внутренне создается новый экземпляр функции с различными внутренними локальными переменными, когда я анализирую функцию a разные переменные каждый раз, когда я запускаю его.