初心者としてきれいなJavascriptコードを書きたいと思って、最近この段落を見つけたときにJavaScriptの名前空間について この記事 を読んでいた:
次のサンプルの一番上にあるコードは、変数(オブジェクトの名前空間)を定義する前に既に存在するかどうかを確認するさまざまな方法を示しています。通常、開発者はオプション1を使用しますが、オプション3と5はより徹底的であり、オプション4はベストプラクティスと見なされます。
_// This doesn't check for existence of 'myApplication' in // the global namespace. Bad practice as you can easily // clobber an existing variable/namespace with the same name var myApplication = {}; /* The following options *do* check for variable/namespace existence. If already defined, we use that instance, otherwise we assign a new object literal to myApplication. Option 1: var myApplication = myApplication || {}; Option 2 if(!MyApplication) MyApplication = {}; Option 3: var myApplication = myApplication = myApplication || {} Option 4: myApplication || (myApplication = {}); Option 5: var myApplication = myApplication === undefined ? {} : myApplication; */
_
オプション1は、私がほとんどの時間で使用しているのを見たことは確かであり、よく理解しています。
オプション2は問題ありませんが、事前に_var myApplication
_がないか、myApplication
でない場合はif(!window.myApplication)
がないようです。グローバルスコープでは、条件if(!myApplication)
がエラーをスローしませんか?
オプション3は私が悩んでいるものです:私の理解では、_myApplication = myApplication
_が最初に実行され、myApplication
がグローバルスコープ(先頭のvar
による)。私の問題は、このオプションがオプション1以外のことをするケースを考えられないことです。
私の目のオプション4は、myApplication
がグローバルにない場合にエラーをスローしないように、window.myApplication || (myApplication = {})
と書いた方が良いでしょう範囲。
オプション5はundefined
以外のfalse-y値を除外していますが、それは良い考えですか? myApplication
が空の文字列である場合、残りのコードは失敗する可能性がありますよね?
誰かが異なるオプションの違いにいくらかの光を当てることができ、特にオプション3がより徹底的に記述されている理由を説明できますか?
記事がオプション3が「より徹底的」であると主張している場合、それは間違っています。その割り当てチェーンの中間にはまったく意味がありません。
誰かが異なるオプションの違いにいくらかの光を当てることができ、特にオプション3がより徹底的に記述されている理由を説明できますか?
まず、警告:2018年には、おそらくこれらのいずれも使用したくないでしょう。代わりに、さまざまなモジュール定義構文( [〜#〜] amd [〜#〜] 、 CommonJS 、 RequireJS )、関連ツール、または import
および export
(そしておそらく Babel などの関連ツールと Webpack または Browserify 。ただし、Chrome、Safari、およびEdgeの現在のバージョンはモジュールをネイティブにサポートしますが、Firefoxは現在もフラグをサポートしています)。
なぜ_
var x = x = x || {}
_は_var x = x || {}
_よりも完全なのですか?
そうではありません。
オプション2は問題ありませんが、事前に_
var myApplication
_がないか、myApplication
でない場合はif(!window.myApplication)
がないようです。グローバルスコープでは、条件if(!myApplication)
がエラーをスローしませんか?
はい。 (生産がグローバルスコープで発生すると仮定します。グローバルスコープではなく、現在のスコープチェーン内にスコープ内にmyApplication
がある場合、myApplication
は未解決のシンボル。)
オプション3は私が悩んでいるものです:私の理解では、_
myApplication = myApplication
_が最初に実行され、myApplication
がグローバルスコープ(先頭のvar
による)。私の問題は、このオプションがオプション1以外のことをするケースを考えられないことです。
いいえ、持っている場合
_var myApplication = myApplication = myApplication || {}
_
これは物事が起こる順序です:
var myApplication
_は、グローバルが存在しない場合は作成し、存在する場合はそのままにしますmyApplication || {}
_が評価され、myApplication
(真実の場合)または_{}
_(そうでない場合)の値を取ります。それを_value1
_と呼びましょうmyApplication = value1
_(中央のもの)が実行され、結果は_value1
_になりますmyApplication = value1
_(左側のもの)は、正当な理由なしに再度実行されます私の目のオプション4は、
myApplication
がグローバルにない場合にエラーをスローしないように、window.myApplication || (myApplication = {})
と書いた方が良いでしょう範囲。
確かに。
オプション5は
undefined
以外のfalse-y値を除外していますが、それは良い考えですか?myApplication
が空の文字列である場合、残りのコードは失敗する可能性がありますよね?
はい。