6

次の CoffeeScript コード:

foo = (x) ->
  alert("hello") unless x?
  alert("world") unless y?

次のようにコンパイルされます。

var foo;

foo = function(x) {
  if (x == null) {
    alert("hello");
  }
  if (typeof y === "undefined" || y === null) {
    return alert("world");
  }
};

fooの引数がチェックされないのに、なぜxチェックされないのですか?undefinedy

4

1 に答える 1

9

未定義のチェックは、存在しない識別子の値を取得するときにスローされる ReferenceError 例外を防ぐためのものです。

>a == 1
ReferenceError: a is not defined

コンパイラは、関数の引数であるため、x 識別子が存在することを確認できます。

コンパイラは y 識別子が存在するかどうかを判断できないため、y が存在するかどうかを確認する必要があります。

// y has never been declared or assigned to
>typeof(y) == "undefined"
true
于 2012-05-16T06:20:53.203 に答える