0

javascriptには、ログ/エラーメッセージを出力する場所を指定するために要素/セレクターを使用できるログ出力のオプションがあります。出力は、初期化時に次のようにフォーマットされます。

var $messageOutput = options.messageOutputElement ? $(options.messageOutputElement) : null;

後でログ機能を介して使用されます。

function outputMessage(msg)
{
    if ($messageOutput !== null)
    {
        messageNum++;
        var $messageOutput = $(options.messageOutputElement);
        var html = $messageOutput.html();
        html += '<b>' + messageNum + '</b><br/>' + msg + '<br/>';
        $messageOutput.html(html);
        $messageOutput.scrollTop($messageOutput[0].scrollHeight);
    }
}

問題は、$ messageOutput === nullの場合でも、outputMessage()内のifステートメントが失敗することです。私はChomeのデバッガーで、$messageOutputが実際にnullに等しいことを確認しました。そして実際、それはとにかくifステートメントにステップインします。

なぜこれが起こっているのかについて誰かが私に洞察を与えることができますか?この件についてご意見をお寄せいただき、ありがとうございます。

4

1 に答える 1

5

関数のスコープで「var$messageOutput」を宣言することにより、グローバルスコープでの変数の参照を停止します。したがって、それを参照する代わりに、関数本体内にまだ設定されていない変数を参照します。これは、nullではなく未定義です。おそらく、「var $ messageOutput = $(options.messageOutputElement);」の「var」部分を削除する必要があります。これにより、代わりに、関数が関数の外部で$messageOutputを参照するようになります。

少し詳しく説明すると、「var」は現在のスコープ内に新しい変数を作成し、混乱を招くために「var foo=function」のようなものは「functionfoo」とは異なる動作をします。ここにあなたの読書の喜びのためのいくつかの楽しいケースと説明があります:

var x = 5;

function f () {
  console.log(x):
  if (!x) {
   var x = 22;
  }
  return x;
}
function g () {
  console.log(x):
  if (!x) {
    x = 22;
  }
  return x;
}
f(); // prints nothing, and returns 22
g(); // prints 5, and returns the same value

また、宣言の方法によっては、グローバルスコープ外で宣言する前に関数を参照できることにも注意する必要があります。例えば:

function f () {
  console.log(f_sub);
  function f_sub () {
    return "subfunction of f";
  }
  return f_sub;
}
function g() {
  console.log(g_sub);
  var g_sub = function () {
    return "subfunction of g";
  }
  return g_sub;
}
f(); // prints and returns f_sub
g(); // prints undefined and returns g_sub

従来の関数宣言はどこでも作成でき、どこでも参照できますが、変数に関数を割り当てると、その行が実行されるまで参照できなくなります。

于 2012-09-11T23:04:31.880 に答える