The documentation covers the the difference from a technical perspective here:
https://reference.wolfram.com/language/tutorial/BlocksComparedWithModules.html
Personally, I try to always use "With". It's behavior is the simplest and it fits well with Functional Programming. But I don't want to cover it here since it would just confuse things.
Talking nontechnically, these are the cases when I use Module and Block:
Module = The most frequently used. Use when you define functions and you need some local variables that will change state.
Block = Use when considering a hypothetical world where a global variable is a different value. For example, there is a global variable $AllowInternet
which is usually set to True
. This controls whether Mathematica should allow itself to pull things from the internet. Say you want to run the function "f" but you want to see how it would behave if $AllowInternet
were set to False
. You would run:
Block[{ $AllowInternet = False}, f[]]
If you're not sure wether to use Module or Block, you probably want Module. See this full post on this subject here:
http://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs