Это особенно запутанный фрагмент кода по ряду причин, которые я попытаюсь объяснить.
Во-первых ... метод setTimeOut - это немного PITA, как описано здесь: http://ifhere.org/javascript
Проблема, с которой вы столкнулись с setTimeout(dog.woof, 0);
, связана с setTimeOut, а не с вашим кодом (ну, не полностью с вашим кодом).
Основная проблема заключается в том, что dog.woof
При выполнении, значение bark
не определено, и причина, по которой он не определен, заключается в том, что вы передаете саму функцию в качестве параметра, а не функцию, поскольку она присоединена к переменной dog.
в обоих:
var fnWoof = dog.woof;
и
setTimeout(dog.woof, 500);
вы передаете определение функции в отличие от экземпляра объекта и его связанной функции.