0

私は、コーディングにおける長年の悪い習慣を片付けようとしています: ウィジェットをグローバル スコープに書き込むことです。

私は、Web ページのニュース ロール用に大規模でほとんど自己完結型のスクリプトを作成しましたが、すべてを関数に詰め込んだ後、それがどれほどうまく機能するかにうれしい驚きを感じました...実際にはあまりにもうまくいきました。

不正行為をしていないことを確認するために、スコープが正しいことを確認するために次のコードを書きました。

var story_count = "THIS IS NOT A NUMBER";

console.log(story_count);

touch_roll = function()
{
    this.story_count = 0;
}

console.log(story_count);

touch_roll();

console.log(story_count);

これにより、コンソールで次の応答が得られることを完全に期待しています

THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER

実際、出力が次のようになっていることを知って、私は完全に驚きまし

THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
0

thisはそれだと思うものではありませんか?研究はあまり役に立ちませんでしたが、私は少し燃え尽きてしまったので、すべて間違って読んでいる可能性が十分にあります. そうでない場合、サイトの既存のビットを台無しにしないように、すべての名前空間をその関数の範囲内に完全に保持するにはどうすればよいですか?


以下のマットの回答に従って、修正されたコードは次のとおりです。

var story_count = "THIS IS NOT A NUMBER";

console.log(story_count);

var touch_roll = new function()
{
    this.story_count = 0;
    console.log(story_count);
}

console.log(story_count);

touch_rollとして宣言し、Javascriptvarとして関数をインスタンス化することにより、その関数newをランタイムとしてオブジェクトに評価します (したがってtouch_roll()、下部の への呼び出しを削除することもできます)。

修正後の出力は次のとおりです。

THIS IS NOT A NUMBER
0
THIS IS NOT A NUMBER
4

1 に答える 1

4

touch_rollで呼び出していないためnewthiswindowオブジェクトです (これは、ブラウザー環境のグローバル変数が属するものです)。

を使用するnewと、次のようになります。

THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER

touch_rollさらに、暗黙のグローバル変数として宣言しています。関数宣言構文を使用するか、a を追加しvarてください。

于 2012-07-10T10:43:15.913 に答える