Sahil's answer is correct. By the time the document is submitted, there is no guarantee that asynchronous scripts are already loaded.
If your code from inside the fbAsyncInit not what you want, you can consider two alternative approaches:
Option 1
Download the sync SDK:
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
Thus, the FB will exist even before the document starts rendering.
Option 2
Check if the SDK has already been loaded, and if you are not running a backup solution.
if (window.FB) { // use FB here .. } else { // still loading, tell user to wait one more second }
source share