【问题标题】:Why does "use strict" not respect variable scope为什么“使用严格”不尊重变量范围
【发布时间】:2014-03-11 17:49:08
【问题描述】:

我对“使用严格”变量的用法有疑问。

为什么下面会默默地失败而不是抛出错误?

"use strict"; 
var $class = {};
$class.rowsICanDisplay = 10;
$class.difference = -1;
var absDifference = 1;
var gridTableBody = $('#mytable tbody');
//code removed for clarity
if($class.difference > 0) {
    var offset = $class.rowsICanDisplay - absDifference; // mistake should be declared in outer scope
    //code removed for clarity
    $('tr:lt(' + offset + ')', gridTableBody).remove();
}
else {
     //code removed for clarity
     $('tr:gt(' + offset + ')', gridTableBody).remove(); // why does this fail silently
}

【问题讨论】:

  • 因为 Javascript 没有块作用域。对不起。不过,JSHint 会捕捉到这一点。
  • @EricHerlitz - 抱歉解决了这个问题(在实际代码中实际上并不是问题)。
  • @SLaks - 啊,我明白了,这很令人沮丧,因为它看起来确实如此。我想我会做一个后期构建任务来运行 JSHint 然后谢谢。 (如果你写这个作为答案,我会选择它)
  • JavaScript 作用域是正常的。外部范围变量在外部范围内可用,并且可用于该范围内的任何函数。
  • 附带说明,我建议您避免在变量名前使用 $。这更像是一个 PHP 的东西,它很容易与 jQuery 混淆。

标签: javascript strict


【解决方案1】:
$('tr:gt(' + offset + ')', gridTableBody).remove(); // why does this fail silently

因为offset 没有在您的else 块的上下文中定义,所以您的选择器无效并且不匹配任何内容。

【讨论】:

  • 但它不应该抛出错误,因为它没有定义,因为使用严格应该防止使用未定义的变量。
  • var offfset = ... 全局定义变量,因此 else 认为它是 已定义,尽管该值将是“未定义”。
  • 只有 javascript 可以有一个值为 undefined 的已定义变量... (我的意思是没有 var x = ...;.
  • @AlexisWilke 您指出的区别在 JavaScript 方面毫无意义,无法区分已声明但未定义的变量和未声明的变量。 typeof offset 将在 else 块中产生 "undefined"
  • @Madbreaks,如果您阅读 SLaks 的回答,您会发现我所说的并非完全偏离目标。 “var”instruction“定义”该函数的变量(或在您不在函数中的全局范围内),无论它是否被赋值以及它出现在函数中的任何位置.这就是“用户严格”没有反应的原因。最好的方法是像在 C 中一样在顶部声明所有变量。
【解决方案2】:

因为 Javascript 没有块作用域。
在函数的任何地方声明的任何变量对整个函数都是可见的。

JSHint 会发现这个问题。

【讨论】:

    【解决方案3】:

    在 else 语句中,未定义偏移量。您需要将其拉出并在“if”结构之外定义它。

    【讨论】:

    • 这是不正确的。 JavaScript 中没有块作用域;在这方面它与 Java 和 C++ 不同。所有var 语句都被视为出现在函数的顶部。
    • 是的,我意识到这一点,但是为了在遇到 else 语句时对其进行定义,他需要将其拉出。我并不是说应用了新的范围,而是他需要将其拉入一个可以在使用之前为该变量提供定义的位置:p
    • 哦,对;我明白你在说什么。严格模式不是不正确,而是因为var初始化表达式没有在else分支中运行!
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2012-01-27
    相关资源
    最近更新 更多