Объяснение вашей проблемы следующее:
Когда вы передаете строку в setTimeout()
, эта строка будет оцениваться как eval()
в глобальной области видимости. Таким образом, любая функция, которую вы вызываете или переменная, на которую вы ссылаетесь, должна быть доступна из глобальной области видимости. Это объясняет, почему вы не можете ссылаться на локальную переменную или аргумент в своей функции, потому что ни те, ни другие не входят в глобальную область видимости, поэтому, когда eval()
пытается их найти, он ищет в глобальной области видимости, а их там нет.
Когда вы меняете функцию setTimeout()
на эту, используя встроенную анонимную функцию:
setTimeout(function() {
whichImage.width = width;
}, 3000);
теперь у вас есть реальный код javascript (не строка), который оценивается там, где он существует без использования eval()
, и из-за замыканий у вас есть полный доступ к локальным переменным и аргументам включающей функции, которая дает вам доступ к whichImage
(аргумент) и width
(локальная переменная), так что ваш код работает.
Это причина № 14, по которой вы всегда должны использовать реальные ссылки на функции javascript или объявления анонимных функций вместо передачи строки в setTimeout()
.