チャクラ。 盞互運甚性は単なる暙準ではない

暙準仕様の䞀郚ではない機胜を実装する決定はどのように行われたすか すべおのブラりザヌプロバむダヌず同様に、倚くの堎合、この決定を䞋す必芁がありたす。 この出版物は、暙準仕様が十分でない堎合に盞互運甚可胜なブラりザヌを䜜成するために䜿甚されるいく぀かの原則を説明するために、実際のJavaScriptの䟋を倚数提䟛したす。



理想的には、暙準の仕様は自絊自足です。 JavaScriptの実装には、ECMAScript仕様で指定されおいるすべおが含たれおいるだけで、それ以䞊は含たれおいたせん。 ブラりザの盞互運甚性を確保するには、 Ecma InternationalやW3Cなどの暙準化組織によっお公開された仕様が䞍可欠であるず考えおいたす。 このような仕様は、ブラりザの゚グれクティブに実装すべき機胜ず、Webサむト開発者に䜿甚すべき機胜を䌝えたす。



むンタヌネットの珟実の䞖界では、物事はそれほど明確に定矩されおいたせん。 仕様が完党であるこずはめったになく、意図的に䞍完党たたはあいたいなたたになるこずもありたす。 ES5仕様の線集者ずしおの私たち自身の経隓により、最終的な解決策を芋぀けられなかった問題が垞にあるず述べるこずができたす。 その結果、暙準仕様で定矩されおいない関数は広く実装され、適甚されたす。 既存のむンタヌネット䞊で動䜜するブラりザを構築しようずする開発者は、暙準の仕様でカバヌされおいない倚くの機胜を実装する必芁がありたす。



実際の正芏衚珟文法ずは䜕ですか




Chakraを䜜成する際、ECMAScript 5ES5仕様正芏衚珟の文法を含むに泚意深く埓いたした。 しかし、実際のWebサむトでテストを開始するず、䞀郚の正芏衚珟リテラルの構文゚ラヌが原因で機胜しなかったペヌゞが出始めたした。 たずえば、次のような右角かっこを含む正芏衚珟でクラッシュが発生したした。



next = /]/.exec(buffer);







その理由は、ECMAScript正芏衚珟の文法が、䞀臎する文字ずしお盎接䜿甚できない文字のリストに含たれおいるためです。 仕様では、シンボル/]/



無効である/]/



たすが、代わりに/\]/



を䜿甚する必芁がありたす。 文字に察するそのような制限は重芁です。そうでなければ、 /axyz[ad]qwer/



などのリテラルを解析するこずが䞍可胜になるためです。 ただし、蚘号[が前に付かない単䞀の括匧]は、実際には分析の障害にはなりたせん。 ただし、この芏栌はただ受け入れられないず䞻匵しおいたす。



実際には、すべおのブラりザヌが/]/



などの正芏衚珟を受け入れ、Webサむト開発者がそれらを蚘述したす。



コンセンサス関数ずは、暙準の䞀郚ではないが、盞互運甚性を提䟛する方法で普遍的に実装されおいる関数を蚘述するために䜿甚する甚語です。 䞀般に、IE9およびその他のJavaScript実装には、実際のWebコンテンツを操䜜するためのこのようなコンセンサス関数を含める必芁がありたす。 それらが暙準の仕様に含たれおいないため、本圓の困難はそれらを識別するこずにありたす。



私たちは、この皮のコンセンサス機胜を維持する必芁性を認識しおおり、むンタヌネットの関連芏栌の将来の版にそれらが含たれるように努力したす。 ただし、すべおのJavaScript拡匵機胜が普遍的たたは均䞀に実装されおいるわけではありたせん。



IE9に名前に_ _文字を含むメ゜ッドがないのはなぜですか




ES5には、メ゜ッドの読み取りず蚭定のサポヌトが含たれおいたす。 䞀郚のWebブラりザでは、長幎にわたっお同様の機胜が利甚可胜です。 この期間䞭、ブラりザ開発者はさたざたな構文ずアプリケヌションプログラミングむンタヌフェむスAPIを詊し、そのようなメ゜ッドを定矩したした。 ES5より前は、最も広く実装されおいたAPIは__defineGetter__および__defineSetter__ずいう名前の2぀のメ゜ッドを䜿甚しお、読み取り/蚭定メ゜ッドを定矩しおいたした。 メ゜ッド名の䞡偎でアンダヌスコアを䜿甚するこずは、䞀郚のブラりザ開発者が実隓的な機胜であるメ゜ッドをマヌクしたり、特定のJavaScript実装の独自の䜎レベル機胜にアクセスするために䜿甚する蚘号です。



ECMA TC39メンバヌは、利点が明らかであるため、ES5仕様に読み取りおよび蚭定方法を含めるこずに同意したした。 ただし、TC39委員䌚は、新しいAPIを䜜成しおそれらを定矩し、__ defineXXX__むンタヌフェむスの暙準化を控えるこずを決定したした。



TC39がこれを行ったのはなぜですか このAPIを提䟛したブラりザヌの動䜜に倧きな違いがあるため。 これらのメ゜ッドの䞀般的なセマンティクスに基づく暙準化は、新しいセマンティクスに合わせお既存のブラりザヌ実装の䞀郚たたはすべおを倉曎する必芁があるこずを意味したす。 そしお、これはおそらく、特定のブラりザで機胜するように曞かれたいく぀かのアプリケヌションを機胜させないでしょう。



もう1぀の理由は、呜名芏則の論理的敎合性を維持するこずです。 ECMAScriptの他の埋め蟌み名は、アンダヌスコアで始たったり、アンダヌスコアで終わったりしたせん。 そのような名前ず実隓的な関数の接続、たたは特定の関数の実装は広く知られおいたす。 暙準化された関数にこのシンボルを䜿甚するず誀解を招き、将来の実隓での有甚性が䜎䞋したす。



TC39委員䌚は、 Object.defineProperty



メ゜ッドに基づいお新しいAPIを開発したした。 このむンタヌフェむスは、読み取りおよび蚭定メ゜ッドのプロパティの定矩だけでなく、他の新しいES5機胜もサポヌトしたす。 __DefineXXX__メ゜ッドはES5仕様に含たれおいたせんでした。



__defineXXX__ APIが既に実装されおいるブラりザヌは、互換性を確保するために、匕き続き倉曎せずにサポヌトできたす。 ただし、ES5暙準をサポヌトするブラりザヌの互換性を確保するために蚘述された新しいコヌドでは、Object.definePropertyメ゜ッドを䜿甚しお、読み取りメ゜ッドのプロパティを決定し、倀を蚭定する必芁がありたす。



開発チヌムはただIE9に__defineXXX__プログラミングむンタヌフェむスを远加するよう求められおいたす。 理由は明らかです。 䞀郚の開発者は、これらのむンタヌフェむスを䜿甚するコヌドを既に持っおおり、このコヌドをIE9で実行したいず考えおいたす。 ただし、IE9開発者は、これらのむンタヌフェむスをサポヌトするこずは、むンタヌネット䞊で盞互運甚性を提䟛するずいう基本的な利益にはならないず考えおいたす。 TC39はすでにこのAPIをレビュヌしおおり、その暙準化は望たしくないず結論付けおいたす。 IE9で__defineXXX__むンタヌフェむスのサポヌトが远加された堎合、このAPIはむンタヌネット䞊で恒久的なコンセンサス機胜にさらに近づくでしょう。 これは基本的にTC39の決定をキャンセルしたす。



残念ながら、短期的には、これにより、この叀いAPIを珟圚䜿甚しおいる開発者にずっお、わずかな远加䜜業が発生したす。 ただし、 Object.defineProperty



メ゜ッドを䜿甚しお__defineXXX__むンタヌフェむスを実装する既存のコヌドの単玔な互換性ラむブラリを䜜成するのは簡単なこずのように思えたす。



手術䞍胜コンセンサス機胜




JavaScriptコヌドでは、関数ぞのリンクを蚭定できたす。たた、関数の宣蚀に先行するコヌドでリンクを呌び出すこずもできたす。 これは、JavaScriptがすべおの関数宣蚀をコヌド本䜓の䞊郚に論理的に「持ち䞊げる」ために可胜です。 JavaScriptでは、同じ名前の耇数の関数宣蚀も蚱可されたす。 簡単なテスト機胜を怜蚎しおください。



  <code> function testFuncDeclarationOrder{</ code> 




  <code> f1; </ code> 




  <code> function f1{alert "first f1"} </ code> 




  <code> </ code> <code> f1; </ code> 




  <code> function f1{alert "second f1"} </ code> 




  <code> f1; </ code> 




  <code>} </ code> 




呌び出し埌、関数は䞀連のアラヌトを䜜成したした「second f1」、「second f1」、「second f1」。 これは、JavaScriptが実際にこの関数を次のように蚘述されおいるかのように凊理するためです。



  <code> function testFuncDeclarationOrder{</ code> 




  <code> function f1{alert "first f1"} </ code> 




  <code> function f1{alert "second f1"} </ code> 




  <code> f1; </ code> 




  <code> f1; </ code> 




  <code> f1; </ code> 




  <code>} </ code> 




ECMAScript仕様では、これたで、関数宣蚀の配眮に1぀の制限のみを課しおきたした。 ECMAScript暙準には、制埡構造内の呜什の本䜓内に関数宣蚀を配眮する機胜は含たれおいたせん。 以䞋にコヌド䟋を瀺したす。



  <code> ifsomeCondition{</ code> 




  <code> function f1{alert "f1"} </ code> 




  <code>} </ code> 




ECMAScript仕様に埓っお解析する堎合、䞊蚘のコヌドは構文゚ラヌを匕き起こしたす。 ただし、任意のブラりザヌで実行するず、゚ラヌは発生しないようです。 呜什が蚱可されおいる堎合はどこでも関数宣蚀のサポヌトは、むンタヌネット䞊のコンセンサス関数です。 もしそうなら、なぜこれはES5に含たれおいないのですか ES5仕様のセクション12は、実際にこれに぀いお䜕かを述べおいたす。



泚 䞀般的に䜿甚されるいく぀かのECMAScript実装が、呜什ずしおの関数宣蚀の䜿甚をサポヌトするこずが知られおいたす。 ただし、実装間では、このような関数宣蚀に適甚されるセマンティクスに重芁か぀矛盟するバリ゚ヌションがありたす。 これらの䞍䞀臎の違いにより、関数宣蚀を呜什ずしお䜿甚するず、実装間で確実に移怍できないコヌドが生成されたす。 ECMAScript実装では、このような関数宣蚀の䜿甚を犁止するか、宣蚀に必須の譊告を添付するこずをお勧めしたす。 ECMAScriptの将来の゚ディションでは、呜什のコンテキストで関数を宣蚀するための代替のポヌタブル手段が定矩される可胜性がありたす。



これらの読めない補剀はどういう意味ですか 簡単に蚀えば、異なるブラりザヌの動䜜は倧きく異なるため、調敎の詊みは非珟実的でした。



IE9は䜕をしたすか IE9は、ES5仕様で掚奚されおいるような関数の呜什宣蚀を犁止しおいたすか いいえ、IE9では、このような広告は以前のバヌゞョンのIEずたったく同じように凊理されたす。



なぜこの決定が䞋されたのですか ブラりザヌ開発者による以前の実隓では、このような広告を拒吊するず、倚くの既存のWebペヌゞが操䜜䞍胜になるこずが瀺されおいるためです。



これはすごいようです。 Webペヌゞは、ブラりザごずに動䜜が異なる機胜に䟝存しおいるにもかかわらず、ブラりザごずに互換性があるのでしょうか。 1぀の可胜な答え実際には、コヌドは䜿甚されたせん。 これは、呌び出されるこずのない関数でも、その結果がペヌゞの機胜にずっお重芁ではない関数でもかたいたせん。 䞀方、JavaScript実装がこれらの関数を構文゚ラヌずしお扱う堎合、関数が呌び出されなかったずしおも、スクリプト党䜓が拒吊されたす。



開発者にずっおこのような危険な関数の実装は望たしくありたせん。 ただし、むンタヌネット䞊での存圚は固定されおいるため、実質的に遞択の䜙地はありたせん。



constはどうですか




IEがconst



宣蚀をサポヌトするかどうか疑問に思う人もいたす。 const



は、「名前付き定数」倀を宣蚀する方法を提䟛する非暙準のJavaScript拡匵機胜です。 兞型的なアプリケヌションは次のようになりたす。



const pi=3.14159;







いく぀かのブラりザはこの機胜をサポヌトしおいたすが、異垞な状況の凊理ず゚ラヌずしお定矩するものには倧きな違いがありたす。 const



を「サポヌト」するブラりザの動䜜のいく぀かの違いを瀺す䟋を次に瀺したす。



  <code> //同じ名前の耇数のconst宣蚀を持぀関数</ code> 




  <code>関数f{</ code> 




  <code> alert 'futing within f'; </ code> 




  <code> const x = 1;  //定数xを1ずしお宣蚀したす</ code> 




  <code> alertx; </ code> 




  <code> const x = 2;  //定数xを2ずしおオヌバヌラむド</ code> 




  <code> alertx; </ code> 




  <code> x = 3;  // xに3を蚭定しおみたす</ code> 




  <code> </ code> <code> alertx; </ code> 




  <code>} </ code> 




  <code> alert 'fabout call';  f; </ code> 




ブラりザに応じお、コヌドは次のこずを行いたす。







実際、 const



宣蚀の非垞に単玔なアプリケヌションのみが、宣蚀をサポヌトするさたざたなブラりザヌず互換性がありたす。 䜕らかの゚ラヌを匕き起こす可胜性のある、より耇雑なアプリケヌションたたはシナリオの倚くは、異なるブラりザヌ間で互換性がありたせん。



実際のJavaScript実装では、ごく少数の些现なナヌスケヌスしかサポヌトできたせん。 たた、この実装は、実際のWebペヌゞで䜿甚可胜な非兞型的な境界線のケヌスず誀ったスクリプトで䜕かを行う必芁がありたす。 暙準化された仕様は、䞻にそのような状況のために存圚する可胜性がありたす。 通垞、単玔な䞀般的なナヌスケヌスをどうするかは明らかです。 境界線の堎合、これには互換性のある実装の存圚を保蚌する暙準の仕様が必芁です。



TC39はconst



をES5に組み蟌むこずを真剣に怜蚎しおおり、初期のES5プロゞェクトに存圚しおいたす。 ただし、その定矩ず他の広告ずの盞互䜜甚には倚くの問題がありたした。 最終的に、TC39でconst



の暙準化が仕様の「次の」改蚂を埅぀こずで合意に達したした。これにより、これらの他の問題のいく぀かが解決される可胜性がありたす。 本質的に、TC39委員䌚は、欠陥のある機胜の暙準化は望たしくないず刀断したした。 代わりに、圌はconst



暙準化を将来に合わせお延期するこずを決定したした。この堎合、1぀の高床な蚭蚈をすべおのブラりザヌに統合できたす。



IE9はconst



䜕をしたすか これたでのずころ、グルヌプは圌を支持しないずいう決定を固守しおいたす。 これは、すべおのブラりザで利甚可胜になったこずがないため、コンセンサス機胜ではありたせん。 暙準の仕様はありたせんが、既存のすべおのブラりザヌ実装の間には意味䞊の倧きな違いがありたす。 これに加えお、TC39は既存の代替案を暙準化しないこずを決定し、ECMAScriptの将来の゚ディションでこの問題を再怜蚎する予定であるこずが知られおいたす。



倚くのりェブサむト開発者がこのような広告を䜿甚できるようにしたいずいう願望は理解できたす。 ただし、関数が存圚する必芁がある堎合、関数の条件付き宣蚀のような別の状況を䜜りたくはありたせんが、Webサむト開発者はブラりザヌの互換性を気にする堎合は䜿甚しないほうがよいでしょう。 最終的に、むンタヌネットの最善の長期的解決策は、むンタヌネットを䜿甚から排陀し、暙準化プロセスが進むのを埅぀こずです。



意思決定ぞの原則的アプロヌチ




これらは、IE9を䜜成するずきにどのような決定を䞋す必芁があるかを瀺す4぀の具䜓的なJavaScriptの䟋です。 むンタヌネット䞊の他の暙準やコンセンサス機胜でも同様の問題が倚く発生したす。 いずれの堎合も、同様の分析が実行されたす。 そしお、芏栌は䜕ず蚀っおいたすか 本圓に必芁なりェブサむトの数は これは共通のセマンティクスを持぀コンセンサス関数ですか 互換性のない機胜オプションがいく぀かありたすか 暙準化委員䌚はこの問題に取り組んでいたすか テストスむヌトはありたすか 採甚は暙準化プロセスを促進たたは劚げたすか 最終的に、それは䞻芳的な刀断の問題であり、したがっお、意思決定に察する原則的で䞀貫したアプロヌチを確保するためにあらゆる努力をするこずが重芁です。



PSあなたはすでにHTML5でHabrを掚定したしたか



All Articles