I am calling a function on button click like this:
function outer() {
alert(\"hi\"
The scoping is correct as you've noted. However, you are not calling the inner function anywhere.
You can do either:
function outer() {
// when you define it this way, the inner function will be accessible only from
// inside the outer function
function inner() {
alert("hi");
}
inner(); // call it
}
Or
function outer() {
this.inner = function() {
alert("hi");
}
}