簡単に言えば、そうではありません。
これがjavascriptの仕組みです。関数名は、関数が割り当てられた単なる変数です。例えば:
function foo () {
alert('foo!');
}
foo = 1;
foo();
数値は関数ではないため、上記のコードはエラーを生成します。関数名と変数名に違いはありません。実際、関数を定義する別の方法は、変数を定義する方法とまったく同じです。
var foo = function () {
alert('foo!');
}
javascriptが再割り当てを防ぐことができないのは、このファーストクラスオブジェクトとしての関数の動作のためです。そうしないと、変数を再割り当てできません(一方、純粋関数型言語では、変数の再割り当てを禁止しても問題はありません)。
回避策とベストプラクティス:
これが、JavaScriptであまり多くのグローバルを定義するべきではないと人々が言い続ける理由です。これには機能が含まれます。そうしないと、誤って他の人のコードと衝突する可能性があります。
この問題を軽減できるjavascriptには、オブジェクトとクロージャという2つの強力な機能があります。
javascriptはオブジェクトをサポートしているため、オブジェクト指向プログラミングを使用して、プログラム内のグローバルの数を制限する必要があります。従来のOOPとは異なり、オブジェクトをコレクションまたは名前空間として使用する場合、javascriptの方がうまく機能します。これは、javascriptにファイルスコープがなく、すべてがグローバルであるためです。
これは、従来のOOPのように小さな問題をカプセル化する小さなオブジェクトを作成するべきではないという意味ではありません。これは、可能であれば、すべてのオブジェクトを1つの親オブジェクトに含める必要があることを意味します。そして、私はここで相続を意味するのではなく、私は持っている関係を意味します。この例については、jQueryやRaphaelなどの人気のあるライブラリをご覧ください。他の人のコードとの衝突を避けるために、1つのオブジェクトのみをグローバルスコープにエクスポートします。
しかし、繰り返しになりますが、これは実際には、オブジェクトを再割り当てすることから人々を保護するものではありません(結局のところ、オブジェクトは変数であるため)。たとえば、JavaScriptの他のビットが実行される前に、HTMLファイルの先頭でこれを行うことでjQueryを簡単に壊すことができます。
jQuery = null;
コードが改ざんされないように保護する方法は、クロージャーを使用することです。サードパーティのコードは、クロージャー内から実行するコードにアクセスできません。つまり、グローバルを回避する限りです。