The difference becomes obvious when we look at the code inside a function. The behavior is different if there's a "jump out" of `try...catch`. For instance, when there's a `return` inside `try...catch`. The `finally` clause works in case of *any* exit from `try...catch`, even via the `return` statement: right after `try...catch` is done, but before the calling code gets the control. ```js run function f() { try { alert('start'); *!* return "result"; */!* } catch (err) { /// ... } finally { alert('cleanup!'); } } f(); // cleanup! ``` ...Or when there's a `throw`, like here: ```js run function f() { try { alert('start'); throw new Error("an error"); } catch (err) { // ... if("can't handle the error") { *!* throw err; */!* } } finally { alert('cleanup!') } } f(); // cleanup! ``` It's `finally` that guarantees the cleanup here. If we just put the code at the end of `f`, it wouldn't run in these situations.