jsにおけるdeleteメカニズム1

4300 ワード

タイトル:転:javascriptのdeleteメカニズムを理解する(1)-小苏2010-05-17 09:57阅覧:86-评论:0|发表评论|返↓
javascriptでは、私たちは時々deleteを使って対象を削除します.しかし、deleteの詳細については、必ずしも知っているとは限りません.昨日、kangaxがdeleteの文章を分析しているのを見て、たいへん勉強になりました.本文は文章の精華部分を訳して、皆さんと分かち合います.
 
  • 原理
  • コードタイプ
  • 実行コンテキスト
  • オブジェクト/可変オブジェクト
  • をアクティブにします.
  • 属性特性
  • 内蔵オブジェクトとDotDelete
  • 宣言されていない割当値
  • Firebug困惑
  • 変数をevalで削除する
  • ブラウザの互換性
  • Gecko DotDelete bug
  • IE bugs
  • エラー
  • 「delete」と宿主オブジェクト
  • ES 5厳格モード
  • 総括
  • 原理
    なぜ私たちはオブジェクトの属性を削除できますか?  
    1 var o = { x: 1 }; 
    2 delete o.x; // true 
    3 o.x; // undefined
     
     
    しかし、このように された はだめです.
     
    1 var x = 1; 
    2 delete x; // false 
    3 x; // 1


     
    またはこのように する :
     
    1   x(){} 
    2 delete x; // false 
    3 typeof x; // 「function」


     
    なお、1つの が されない 、deleteはfalseだけに る.
    この を するには、まず の と のような を につけなければなりません. なことに、これらはjavascriptに する ではあまり り げられません. のいくつかの の で にこれらの を めてみます.それらを するのは しくないです. らがなぜこのように いているのかを にしないならば、この を に び えられます.
    コードの
    ECMAScriptには、グローバルコード(Global code)と コード(Function code)とEval codeの3つのタイプがあります.これらのタイプは がありますが、ここではまだ な を います.
  • ソースコード がプログラムとして われると、グローバルコード(Global code)として されます. つのブラウザ では、SCRIPT の は プログラムとして され、したがって、グローバルコードとして されます.
  • は、1つの の で される のコードを、 コードとして らかにしています.ブラウザの いイベント の ( えば、<p onclick="...">)は、 に コードとして されます.
  • に、 eval()に されたテキストをEvalコードとして します.このタイプはすぐに られます.
  • .
     
    コンテキストを
    ECMAScriptコードが されると、 に のコンテキストで され、 はやや なエンティティであり、 と の がどのように するかを するのに ちます.3つのタイプの コードについては、それぞれ のとおり されます. が されると、 コード(Function code)に が ります.グローバルコード は、グローバルコード(Global code)の コンテキストに ります.
    あなたが ているように、コンテキスト はスタックから ています.まず、 の ドメインのグローバルコードがあります.コードの には が び されています. は の を び すことができます. は に び しても、 しい コンテキストに ります.
    オブジェクト/ オブジェクトをアクティブにします.
    コンテキストは、その に オブジェクトと ばれるオブジェクトがあります. コンテキストと に、 オブジェクトは なエンティティであり、 の を するメカニズムです. 、 も いのは、ソースコードで されている と が、この オブジェクトの として されます.
    がグローバルコードの コンテキストに ると、グローバルオブジェクトは オブジェクトとして します.これは、グローバル で された や がグローバルオブジェクトの に わった です.
     
    コード
    1 /* remember that `this` refers ト global object when in global scope */
    2   var GLOOBALUBJECT = this 
    3   var foo = 1; 
    4   GLOOBALUBJECT.foo // 1 
    5   foo === GLOOBALUBJECT.foo // true   
    6     bar(){} 
    7   typeof GLOOBALUBJECT.bar // 「function」 
    8   GLOOBALUBJECT.bar === bar; // true
     
     
    Ok、グローバル はグローバルオブジェクトの になりますが、それらの コードで されているローカル はどうなりますか? は ています. オブジェクトの になります. の いは、 コードの で、 オブジェクトはグローバルオブジェクトではなく、いわゆるアクティブオブジェクトです. コード に.(Function code) に ると、アクティブなオブジェクトが されます.
    コード(Function code)の と がアクティブ の となるだけでなく、 の パラメータ( に する )と のArguments オブジェクト(Arguments )も である.
     
    コード
     1 (function(foo){ 
     2   var bar = 2. 
     3     baz(){} 
     4   /* 
     5   In abstract terms、 
     6   Special `アーグメンント` object becons a. property   containing function Activation object: 
     7     ACT IVATIONUBJECT.argments; // Agments object 
     8   ...as well as argment `foo` 
     9     ACT IVATIONUBJECT.foo; // 1 
    10   ...as well as variable `bar`: 
    11     ACT IVATIONUBJECT.bar; // 2 
    12   ...as well as   declared localy: 
    13     typeof ACT IVATIONKUOBJECT.baz; // 「function」 
    14   */
    15 })(1)
     
     
    に、Evaalコードで された は、 び し のコンテキストの オブジェクトの として されます.Evaalコードは、 び し のコンテキストの オブジェクトのみを します.
     
    コード
     1 var GLOOBALUBJECT = this 
     2 /* `foo` is created as a. property   カリン context Varable object 
     3     which in this case is a. Global object */
     4 eval('var foo = 1; 
     5 GLOOBALUBJECT.foo // 1 
     6 (function(){ 
     7   /* `bar` is created as a. property   カリン context Varable object 
     8     which in this case is an Activation object   containing   */
     9   eval('var bar = 1; 
    10   /* 
    11     In abstract terms、 
    12     ACT IVATIONUBJECT.bar; // 1 
    13   */
    14 })()