2017-10-19 1 views
0

これは「学術的興味」から外れています(ただし、私はどこかで使用することを考えています)。方法自体を削除する - それは動作しますが、なぜそれを使用しますか?

function f2() 
{ 
    delete Widget.f1; 
    Widget.f3 = function() 
    { 
     console.log("This works."); 
    } 
} 

let Widget = 
{ 
    f1: function() 
    { 
     f2(); 
    } 
} 

console.log(Widget); 
Widget.f1(); 

console.log(Widget); 
Widget.f3(); 

したがって、私は基本的にオブジェクトから自分自身を削除し、別のメソッドに置き換えるメソッドを呼び出します。それはうまくいくようです。ここに私の2つの質問があります:

  1. 私はこれをしてはいけない理由はありますか?

  2. 「JavaScriptの内部にある」という観点からは、どのように機能しますか?直感は、f1が完了するまで「開かれた」ままであると言います。これは、まだ「開かれている」機能を削除することを意味します。 f2()コールは何とか "持ち上げ"られていますか?

乾杯

+1

実行中の関数を削除しているわけではありません( 'Widget.f1')。実行される関数は 'f2'です。したがって、 'f2'は' Widget.f1'をうまく削除できます。 –

+0

これは、関数ではなく、オブジェクトプロパティ 'f1'を削除しています。 – MinusFour

答えて

1

私はこれを行うべきではない理由を良い(技術的な)理由がありますか?

私がこれを使用しない主な理由は、他の開発者(future-BVDevを含む)があなたがそれをしていることに気付かず、理解していないときに混乱し、なぜあなたはそれをやっているのですか?

「JavaScriptの内部」の観点から、どのように機能しますか?

Widget.f1は、関数への参照であり、関数自体ではありません。だからあなたがdelete Widget.f1になったら、その参照はなくなりましたが、関数は引き続きメモリに存在します。また、現在の実行スタック上にも存在し続けます。関数への他の参照がある場合、呼び出しスタックが終了した後も引き続き存在します。一方、これが関数の唯一の参照であった場合、しばらくしてガベージコレクタが実行され、関数が占有していたメモリが解放されます。

+0

クール、ありがとう。私は関数参照のコピーが "そこにある"という可能性を考慮しませんでした。私は別の方法を探します。 – BVDev

関連する問題