JavaScriptのstritモードとwithキーワード紹介
3901 ワード
2009年12月にECMAScript 5が発表されました.この距離は前のバージョンのECMAScript 3標準が発表されてから丸10年になりました.その間、JavaScriptはwebプログラミングを大いに行っていますが、ECMAScript 4は最終的に利益関連の各大手メーカーと組織がこの言語の複雑さになります.ECMAScriptの新しい標準の制定をさせて、プログラミングの実践に大きく遅れています.ECMAScript 5は目標の上でそんなに野心的ではありませんて、JSONに対する支持と反射の更に全面的なコントロールを新たに増加したことを除いて、一つの重要な改善は“厳格なモード”を導入します.このモードでは、ECMAScriptの文法がより厳格になり、従来多くのよく見られていた誤りやすいコードが、強制変数宣言やwithステートメントなどを含むことができなくなります.このようなモードを採用するのは簡単です.シナリオファイルまたは関数の最初の行に「use strict」を追加すればいいです.このように一行の文字列でいいです.
2010年にはまた、以下のように、Withキーワードの欠陥を議論するための文を書いていることが分かりました.
くさび
むかしむかし、神筆馬良の故郷は彼を記念するために通りを彼の名前で名づけました.馬良は断りませんでしたが、四文字の意見を出しました.数年後、よそ者がここに来て、この通りに地元の人が道を聞くのを止めました.
すみません、これは神の道ですか?
はい、これは神の道です.
あなたも知らないですか?
私はこの人です.どうして分かりませんか?
ここは神の道ですか?
分かりました.何を聞きますか?
私はこれが神の道だとは知りませんでした.
それはもうあなたに教えたのではないですか?これは神の道ですか?
もう一度言ってくださいませんか?これは神の道です.
……
その後、この地元の人は当時の神筆馬良の意見を思い出し、はっと悟りました.馬良は――略さないことを言います.
A Question
One day Tom said to Wang Er,his Chinese friend,“I have a dream.I want to show mysself on CCTV.”The next day Tom brook e into a neighbor shop.The police didn't much muttime to idadef and arest cavere
The question is when Tom said his dream、he is
A)ambitions B)not ambitions C)ambigous D)unambigous
The right answer is B)and C)
本文
以上の二つの古今東西の例は説明が簡単で、時には異義を引き起こすことがあります.これはJavascriptにも存在します.長い名前の変数を繰り返し引用するのは面倒くさい場合があります.
object WithLongName 1.propty 1=value 1;
object WithLongName 1.propty 2=value 2;
object WithLongName 1.propty 3=value 3;
object WithLongName 1.method 1()
しかし、はっきりとした名前はプログラムの可読性にとっても重要です.したがって、Javascriptはwith文を提供しています.上記の例は次のように書き換えられます.
実は、小さな改善さえすれば、これらの欠陥を取り除くことができます.対象を省略した属性の前に点記号を付けることができます.このように属性と外部変数の間に直観的な区別が付けられています.他の多くの言語がこのようにしています.私たちの最初の例はこうなります.
object WithLongName 1.propty 1=object WithLongName 2.propty 1;
object WithLongName 1.propty 2=object WithLongName 2.propty 2;
……
object WithLongName 1.propty 10=object WithLongName 2.propty 10;
書き上げられます
2010年にはまた、以下のように、Withキーワードの欠陥を議論するための文を書いていることが分かりました.
くさび
むかしむかし、神筆馬良の故郷は彼を記念するために通りを彼の名前で名づけました.馬良は断りませんでしたが、四文字の意見を出しました.数年後、よそ者がここに来て、この通りに地元の人が道を聞くのを止めました.
すみません、これは神の道ですか?
はい、これは神の道です.
あなたも知らないですか?
私はこの人です.どうして分かりませんか?
ここは神の道ですか?
分かりました.何を聞きますか?
私はこれが神の道だとは知りませんでした.
それはもうあなたに教えたのではないですか?これは神の道ですか?
もう一度言ってくださいませんか?これは神の道です.
……
その後、この地元の人は当時の神筆馬良の意見を思い出し、はっと悟りました.馬良は――略さないことを言います.
A Question
One day Tom said to Wang Er,his Chinese friend,“I have a dream.I want to show mysself on CCTV.”The next day Tom brook e into a neighbor shop.The police didn't much muttime to idadef and arest cavere
The question is when Tom said his dream、he is
A)ambitions B)not ambitions C)ambigous D)unambigous
The right answer is B)and C)
本文
以上の二つの古今東西の例は説明が簡単で、時には異義を引き起こすことがあります.これはJavascriptにも存在します.長い名前の変数を繰り返し引用するのは面倒くさい場合があります.
object WithLongName 1.propty 1=value 1;
object WithLongName 1.propty 2=value 2;
object WithLongName 1.propty 3=value 3;
object WithLongName 1.method 1()
しかし、はっきりとした名前はプログラムの可読性にとっても重要です.したがって、Javascriptはwith文を提供しています.上記の例は次のように書き換えられます.
with (objectWithLongName1){
propty1=value1;
propty2=value2;
propty3=value3;
method1();
}
このように多くのキーボードを打つ手間を省き、プログラムの構造もより明確になります.しかし、このような簡単な書き込みには曖昧性が導入されています.どのようにして大括弧内の名前を知ることができますか?Javascriptの解析規則は、まずobject WithLongName 1でこれらの名前の属性を調べます.見つけられなかったら、外部変数だと思います.コードで説明するとこうなります.
if(objectWithLongName1.property1!==undefined){
if(objectWithLongName1.value1!==undefined){
objectWithLongName1.property1=objectWithLongName1.value1; // 1
}else{
objectWithLongName1.property1=value1;// 2
}
}else{
if(objectWithLongName1.value1!==undefined){
property1=objectWithLongName1.value1; // 3
}else{
property1=value1;// 4
}
}
私たちはこの4つの可能性の一つを望んでいますが、ちょっと油断するとプログラムが実行されるかもしれません.また、このような書き方はプログラムの読者にとっても非常に難しいです.一方、Javascriptインタプリタに対して、この不確実性は言語の性能にも影響を及ぼしている.実は、小さな改善さえすれば、これらの欠陥を取り除くことができます.対象を省略した属性の前に点記号を付けることができます.このように属性と外部変数の間に直観的な区別が付けられています.他の多くの言語がこのようにしています.私たちの最初の例はこうなります.
with (objectWithLongName1){
.propty1=value1;
.propty2=value2;
.propty3=value3;
.method1();
}
Javascriptがこのような改良をする前に、両害相は軽く取り、できるだけwith文を使わないようにします.私たちは相変わらずいくつかの融通のきかない方法を採用することができます.
var o1= objectWithLongName1;
o1.propty1=value1;
o1.propty2=value2;
o1.propty3=value3;
o1.method1();
またはこのような場合:object WithLongName 1.propty 1=object WithLongName 2.propty 1;
object WithLongName 1.propty 2=object WithLongName 2.propty 2;
……
object WithLongName 1.propty 10=object WithLongName 2.propty 10;
書き上げられます
(function(o1, o2, pl){
pl.forEach(function(item){o1[item]=o2[item];});
})( objectWithLongName1,objectWithLongName2, [‘propty1', ‘propty2', … , ‘propty10']);