javascript - if (foo !== null) 计算结果为 true,即使 foo 为 null

标签 javascript jquery

在 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 语句。

任何人都可以告诉我为什么会发生这种情况吗?预先感谢您对此事的任何意见。

最佳答案

通过在函数作用域中声明“var $messageOutput”,您可以停止在全局作用域中引用该变量。因此,它不是指那个,而是指一个尚未在函数体内设置的变量,该变量是未定义的,而不是 null。您可能应该删除“var $messageOutput = $(options.messageOutputElement);”的“var”部分,这将使函数引用函数外部的 $messageOutput。

详细说明一下: “var”在您所在的范围内创建一个新变量,并且更容易混淆的是“var foo = function”之类的行为与“function foo”不同。以下是一些有趣的案例和解释,供您享受阅读乐趣:

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

传统的函数声明可以在任何地方进行声明并在任何地方引用,但是将函数分配给变量意味着在执行该行之前无法引用它。

关于javascript - if (foo !== null) 计算结果为 true,即使 foo 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379071/

相关文章:

javascript - 如何将 JavaScript 值从 View 传递到 Controller ?

javascript - 如何让 div onblur 事件执行 javascript 函数?

javascript - 当字段自动填充时如何触发jquery函数?

javascript - chrome 中超出了最大调用堆栈大小,IE 中堆栈空间不足 (JavaScript)

javascript - Php unlink() 返回包含空格的编码文件路径错误

javascript 在博主帖子中不起作用

javascript - Angular JS : Use orderby with a select tag selected value

jquery - 如何使用 jQuery 获取元素的所有计算样式?

javascript - 是否可以检测页面上的表单提交并执行我的操作,然后让表单像平常一样继续?

javascript - Angular $注入(inject)器:modulerr for ui-router $urlServiceProvider