I would potentially extend it one step further: I assume your example is a reduced and simplified sample for easy conversation. If your application is to have a lot of DOM manipulation (ie. some elements could get destroyed and rebuilt) or if you run into timing issues surrounding the 'click' event being bound, I would use .delegate() to bind the click instead:
$(document).ready(function(){
$("p").hide(); // there are other ways to hide depending on your needs or to avoid FOUC
$("body").delegate("button", "click", function() {
$("p").show();
}
});
I chose "body" as the listener simply because I don't know your page contents. The best listener is the nearest parent that is at no risk of being destroyed, often a wrapper div of some sort. Swap out "body" for a more specific selector if you can.
Here's the difference:
.click() : "Grab this specific element and ask it to listen for clicks on itself."
.delegate(): "Grab a parent-level object and ask it to listen for clicks on any element matching the designated selector."
.delegate() might be "overkill" for some purposes, but I use it whenever I can because it is much more future-proof.