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厳格モード 総括 原理
なぜ私たちはオブジェクトの属性を削除できますか?
javascriptでは、私たちは時々deleteを使って対象を削除します.しかし、deleteの詳細については、必ずしも知っているとは限りません.昨日、kangaxがdeleteの文章を分析しているのを見て、たいへん勉強になりました.本文は文章の精華部分を訳して、皆さんと分かち合います.
なぜ私たちはオブジェクトの属性を削除できますか?
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
4
5
またはこのように する :
1 x(){}
2 delete x; // false
3 typeof x; // 「function」
4
5
なお、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 })()
…