2012-08-08 4 views
9

私は、変数が未定義であるかどうかをチェックし、再利用可能な関数を作成しようとしています。奇妙なことは、関数に変数を渡してコードを実行すると機能しないことですが、関数の外部で同じロジックを使用すると機能します。この機能を有効にする方法はありますか?未定義の変数を関数に渡すとエラーが発生しますか?

//THIS WORKS AND RETURN FALSE 
alert(typeof sdfsdfsdfsdf !== 'undefined'); 

//THIS GIVES AN ERROR, WHY? 
//Uncaught ReferenceError: sdfsd is not defined 
function isDefined(value) { 
     alert(typeof value !== 'undefined' && value !== null) 
} 

isDefined(sdfsd); 

ライブたとえば、ここで(エラーのコンソールを確認してください):http://jsfiddle.net/JzJHc/

+0

あなたはこれを行うことはできません。それが存在しなければ、それをテストするためにどのように関数に取り込むことができますか?また、これは: 'typeof value!== 'undefined' && value!== null'はひどく必要ありません。 'null'または' undefined'テストをしたいのであれば、 'value == null'を実行してください。それは同じことを成し遂げます。 –

答えて

10
それは typeofテスト

でいない限り、あなたは合格しようとしたときに宣言されていない変数を使用することはできません

その宣言されていない変数を使用しているとみなされる、関数に宣言されていない変数。あなたはないisDefined

の内側にあなたが関数に渡す前に

if (typeof sdsdsd !== 'undefined') 

のチェックを実行する必要があり、エラーが呼び出し側にあることに気づくでしょう。基本的にそれはあなたがが宣言されていない変数を受け入れisDefined関数を書くことができないことを意味します。あなたの関数は(周りに渡すことがOKです)未定義のプロパティ

のために働くことができますしかし、私は好奇心、あなたが存在しない変数を渡している現実世界のケースは何ですか?変数はすべて宣言し、すでに存在するはずです。あなたはそれがundefinedの値が存在することになるとあなたのisDefined機能がうまく動作しますvar sdsdsdsを宣言していました。

+0

+1 *特に*最後の段落。 –

+0

確かに、あなたの最後の段落で、私は物事をよりエレガントに再建築することを考えさせました。私のシナリオでは、MVCビューを通して変数がレンダリングされています。しかし、ビューには、要求に結果がない場合はレンダリングしないという条件があります。だから私の初期化JavaScript(別のビューから)は、そのオブジェクトが存在するかどうかをチェックし、アクションを実行しません。だからあなたは正しい、私はMVCの条件の外に変数を宣言する必要があります。助けてくれてありがとう! – TruMan1

+0

宣言されていない変数を使用できるもう1つのケースは、* delete *です。 – zsong

関連する問題