Thorough Explanation of Apply, Bind and Call in JavaScript