Javascriptアラート()が置き換えられる

このコードを実行すると、なぜグローバルな alert()関数が置き換えられるのか混乱しています。私はここで prototype を使用していません。

Moo = (function(){              
    this.alert = function(s){
        console.log("Replaced Alert! " + s);
    };                  
    return this;    
})();

alert("poit");

コードを実行すると警告ポップアップが表示されず、代わりに上記のコードが実行され、テキストがコンソールに表示されます。誰か説明できますか?

2
「this」演算子の MDNリファレンスをご覧ください。それはそれが使用されるいくつかの方法を説明します。
追加された 著者 Alexander,

3 答え

this inside the invoked anonymous function refers to window. So, you're overwriting the global alert method.

メソッド alert を使用して新しいオブジェクトを作成する場合は、次のようにします。

Moo = (function(){
    var obj = {};
    obj.alert = function(s){
        console.log("Replaced Alert! " + s);
    };                  
    return obj;    
})();

別の方法:

Moo = (function(){
    var obj = new function(){};
    obj.prototype.alert = function(){...}
    return new obj;
})();
8
追加された
@ jfriend00クロージャでは、周囲のコードを汚染しないローカル変数を定義することができます。これらのローカルスコープのもう1つの利点は、内部メソッドがそれを定義しない限り、外部から変更することができないことです。
追加された 著者 Rob W,
それは確かにそれをクリア...
追加された 著者 Ian,
問題を浮き彫りにするためのコードの例を示しています。私のコードはかなり複雑です。
追加された 著者 Ian,
@ jfriend00あなたはコードを文字通り取っているようだ... OPは既に非常にはっきりと明示的に明らかになっているが、これは単に問題を強調するコードの非常に単純な例であり、 実際のコードはもっと複雑です。あなたのロジックでは、オブジェクトが、 "Console"とそのプロパティ "log"が定義されていると仮定して、出力されるすべてのものに "Replaced Alert!"を付加する警告メソッドが必要な理由、変数名としてオノマトペを利用する
追加された 著者 Alexander,

上で述べたように、あなたのケースでは、 this は(あなたがコンストラクタにないので)ウィンドウを参照しているということです。

あなたはその代わりにしたくなかったのですか? :

Moo = new (function(){              
    this.alert = function(s){
        console.log("Replaced Alert! " + s);
    };                  
    return this;    
})();

新しいキーワードを使用して

3
追加された

this はグローバルコンテキスト( window )として評価されます。

JavaScriptの this のセマンティクスは、必ずしもあなたが期待するものではありません。

0
追加された
私はそれに気づいた。 Javascriptsのスコープは非常に厄介です。
追加された 著者 Ian,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript