ホームページ >ウェブフロントエンド >jsチュートリアル >JS で最も一般的かつ最も混乱を招く構文 (翻訳済み)_JavaScript スキル

JS で最も一般的かつ最も混乱を招く構文 (翻訳済み)_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 18:17:23974ブラウズ

js の中括弧には 4 つのセマンティック関数があります
セマンティック 1、最も一般的な複合ステートメントの編成

コードをコピー コードは次のとおりです:

if(condition ) {
//...
}else {
//...
}
for() {
//...
}

セマンティック 2、オブジェクト リテラル宣言
コードをコピー コードは次のとおりです:

var obj = {
name : 'jack',
age : 23
};

全体は代入文であり、{name:'jack',age:23} が式であり、これが単独で存在しても文法エラーは発生しません。
セマンティック 3、関数または関数リテラルを宣言
コードをコピー コードは次のとおりです。 🎜>
function f1(){
//...
}
var f2 = function(){
//...
}

f1 と非 f2 の違いは、前者が構文解釈期間にあり、後者が実行時にあることです。違いは、関数を呼び出すコードが関数定義の後にある場合は違いがありませんが、関数を呼び出すコードが関数定義の前にある場合は f1 を呼び出すことはできますが、f2 はエラーを報告して、その旨を通知します。 f2は定義されていません。

セマンティクス 4、構造化例外処理の構文シンボル
コードをコピー コードは次のとおりです。
try {
//...
}catch( ex ){
//...
}やっと{
//...
}

ここの中括弧と一致するステートメント (意味 1) の間に違いがあります。中括弧内のステートメントが 1 つだけの場合は、if/else/ で中括弧を省略できます。 for など。ただし、try/catch/finally は省略できません。

私は長い間次のコードに苦労していました
function(){}() //匿名関数はすぐに実行され、構文解析中にエラーが報告されます。
{}.constructor //コンストラクターを取得します。

謎なのは、なぜ [].constructor がこのように記述されているのに、エラーを報告しないのかということです。 1 つはオブジェクトの直接の値であり、もう 1 つは配列の直接の値を取得したい単なるコンストラクターです。
もちろん、受信する変数を追加してもエラーは報告されません。
var c = {}.constructor;
同じ状況、例えば
var fn = function(){}() 、エラーは報告されません。
実際に問題を引き起こしているのは js の「ステートメントの優先順位」です。つまり、{} はオブジェクト リテラル (セマンティック 2) や宣言された関数のセマンティックではなく、複合ステートメント ブロック (セマンティック 1) として理解されます。 (意味3)。
function(){}()、中括弧は複合ステートメントとして理解されます。当然、前の手順で宣言された function() の構文は不完全であるため、構文解析中にエラーが発生します。
{}.constructor では、中括弧は複合ステートメントとして理解され、中括弧の後にドット演算子が続きます。ドット演算子の前に適切なオブジェクトがない場合は、当然エラーが報告されます。
この修正はよく知られています: 必須の演算子を追加します ()
(function(){})(), (function(){});//強制的に関数として理解されるようにします (セマンティック) 3)「関数()」は関数が実行されること、つまり宣言後すぐに実行されることを意味します。
({}).constructor //({}) は、中括弧をオブジェクト リテラルとして強制的に解釈します (セマンティック 2)。「Object.xx」は、オブジェクトのメンバーを取得することを意味します。当然、後続のドット演算子を使用できます。正常に実行されます。


拡張: JQUERY プラグインの書き込みは事前に実行する必要があります
いくつかの JQ プラグインに注目すると、次のコードがよく見つかります:
(function($){$(function( ){/*code*/})}($))
上記の記事を読めば、なぜ多くの JQ プラグインにこれ​​が必要なのかがわかります。使用しないときに事前に実行する必要があります。はい、しかし、私が書いているときにこのようなプラグインに遭遇することはほとんどありません。しかし、多くの利点があります~~。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。