2013-06-23 7 views
8

javascript以外のバックグラウンドから来て、私は「未定義」の周りを頭で囲んでいます。 次のように私は「isUndefined」機能を書いた:関数と定義されていないことを理解する

function isUndefined(value) { 
    return (typeof value === 'undefined'); 
} 

を私は(ここで、変数「ブーイングが」が存在しない)私の元でこれを入力すると、私は期待された結果、「未定義の変数」を取得します。

if (typeof boo === 'undefined') { 
    console.log('undefined variable'); 
} 

私は次のように入力した場合: console.log (isUndefined(undefined));

私が期待した結果 '真'

を取得し、私が入力した場合:console.log(isUndefined(boo));

を私が手:

Reference Error: boo is not defined.

私は「真実」を得ることを期待しています - だから私質問はなぜundefinedの最初の '直接'チェックが期待された結果を返すのでしょうか?

+1

あなたはこれに困惑することが正しいです。 –

+0

あなたはどのような背景から来ていますか? – galchen

+1

http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/ – goat

答えて

7

です。変数名が存在しない場合、それを参照しようとするとエラーになります。

演算子は特別なケースです。その名前の変数がなくても名前を受け入れます。しかし、名前が実際にtypeofオペレータで使用されているときだけです。

関数の例では、存在しない名前を使用し、という名前が使用された時点でtypeof演算子はありません。それがエラーの発生場所です。 typeofを使用する関数に名前を渡すことは重要ではありません。その関数は既にエラーが発生しているため呼び出されることはありません。

あなたの関数は、既存の変数名を与えると期待通りに機能します。その変数がundefined値を持っているか、いない場合、それはあなたを言うだろう:あなたはグローバル変数をチェックしていた場合、あなただけではなくboowindow.booを言っている場合

var boo; // now boo exists but has the undefined value 
console.log(isUndefined(boo)); // will log 'true' 

は、それが働くだろう。これは、オブジェクトの存在しないプロパティを参照するのはエラーではないためです。あなたがこれを行うとき、それはあなたにundefined値を与える:あなたはローカル変数はしかし、存在するかどうかをチェックしたい場合、それはwindowのプロパティではありませんので、動作しないでしょう

// logs 'true' if there is no global 'boo' 
console.log(isUndefined(window.boo)); 

オブジェクト。

3

私はこのようにそれを入れてみましょう:同じ理由

var a = 5; 
function foo(v){ 
    v += 5; 
    console.log(v); 
} 

foo(a); 
console.log(a); // will give you 5, not 10 

- あなたは

isUndefined(boo) 

を呼び出すときに、変数booが送られていない、ブーイングの値が送信されます。呼び出し中にbooが定義されていないため、値に到達しようとするとエラーが発生します。

それはtypeofが関数ではないことを言及する価値がある、それはundefined値を含むように起こる既存の変数、および全く存在しない変数間の違いがあり、オペレータ

2

通常、Javascriptで存在しない変数にアクセスしようとすると、ReferenceErrorがスローされます。 typeof演算子は、存在しない変数に渡すとそのようなエラーを出さないよう特別にコード化されているので、ここでは例外です。

http://es5.github.io/#x11.4.3

11.4.3 The typeof Operator # Ⓣ

The production UnaryExpression : typeof UnaryExpression is evaluated as follows:

Let val be the result of evaluating UnaryExpression. 

If Type(val) is Reference, then 

    If IsUnresolvableReference(val) is true, return "undefined". 

    Let val be GetValue(val). 

にReferenceErrorを避けるために、あなたはそれには何も割り当てずに、事前にboo宣言することができます。

var boo; 
console.log(isUndefined(boo)); 
console.log(typeof boo == 'undefined') 
関連する問題