是否有用于NOT使用var,let或const?

时间:2018-03-19 07:12:05

标签: javascript

我看了很多关于“no var”主题的问题/答案,但我仍然感到困惑

  

“no var”将查找范围链,直到找到变量或   达到全球范围(此时它将创建它)

我明白这一点,但如果确实发现了什么,那么“无变量”会怎么做?例如,如果你想改变一个现有的变量或绑定,你是否再次使用var / let,或者如果你不这样做就可以了吗?有区别吗?

4 个答案:

答案 0 :(得分:1)

如果没有使用varletconst语句,请执行以下操作:

x = 100;

将变量分配给全局范围,或者在范围内找到它时重新分配,通常不是所需的行为,因为这会导致范围混乱,或者变量覆盖,所以奇怪的错误。 / p>

要在范围内的任何位置重新分配变量,只需使用与上述相同的方法:

x = 101;

如果你有这样的事情:

//global scope
var z = 40;

(function () {
  //scope »level 1«
  var x = 100;
  //implicitly declared in global scope
  y = 300;

  z += 1;

  console.log(z); //41

  (function () {
    //scope »level 2«
    x = 101;
    z += 1;
  })();

console.log(x) // 101;
console.log(y) // 300;
console.log(z) // 42;

})();


console.log(x) // undefined;
console.log(y) // 300;
console.log(z) // 42;

以有用的方式使用范围链的基本示例:

//create a »working scope«
//to prevent cluttering the global
(function () {
  var getID = (function () {
    //hide the id variable in child scope
    //to prevent it from modification
    var id = 0;

    return function () {
      //modify and return values
      //from this scope
      id += 1;
      return id;
    }
  })();

  //that doen't make much sense,
  //but is also a example of using a
  //working scope
  var usedIds = Array.prototype.slice
    .call(document.querySelectorAll('.a-class'))
    .map(function (node) {
      var id = 'my-id-' + getID();
      node.id = id;
      return id;
     });

  // export/expose variables to the global scope explicitly
  window.globallyNeeded = usedIds;
})();

答案 1 :(得分:1)

简短的回答是否定的,而不是现代的JavaScript。

过去JavaScript粗略设计的一个特点是无论你是否愿意,都会自动创建变量。

这意味着以下代码:

static

会导致创建两个变量(JavaScript,当然,区分大小写),并且您的代码中会出现逻辑错误。

在现代代码中,您应该从apple=3; Apple=apple+4; alert(apple); 指令开始,这将禁止未声明的变量:

'use strict'

'use strict'; var apple=3; Apple=apple+4; // error: undeclared Apple alert(apple); 有助于缩小差距,导致代码邋and且难以管理。尝试分配未声明的变量时会引发错误。

'use strict'关键字提供两个角色。首先,它声明变量,从而通知JavaScript解释器它是有意的。其次,它还设置变量的范围 - 范围将是包含环境的范围,通常是声明变量的函数。

更现代的JavaScript添加了var,它锁定了一个变量(一个只读变量)的值,const为变量提供了更有限的范围。

您通常应该使用let指令,这将强制养成良好的习惯。在任何情况下,您都应该始终将变量/常量声明为仔细代码设计的一部分。

在我看来,任何发现声明变量过于艰巨的人都是一个糟糕的开始,可能不应该编写JavaScript。

答案 2 :(得分:0)

如果您在您选择的范围内初始化变量,则只能使用varlet。但请记住,变量初始化的let关键字仅适用于ECMAScript 2016及更高版本。此外,const关键字。 letconst之间的区别在于,第一个是变量(其值可以更改),第二个是常量(其值无法更改,它&# 39; sa fix value)。

此外,let关键字具有更严格的范围定义。这意味着,let关键字是特定于块范围的。只有内部块可以读取外部let变量。但是如果你在e里面定义一个let变量。 G。一个while块,它不存在于循环之外。

答案 3 :(得分:0)

我刚刚遇到了导致我写这篇文章的情况,我认为这是一个很好的例子:

let requestViaCEP = function (cep) {
    callbackRequestViaCEP = function (resultadoCEP) {
        responseViaCEP = resultadoCEP;
    }
    return new Promise ((resolve, reject) => {
            $.getScript("https://viacep.com.br/ws/" + cep + "/json/?callback=callbackRequestViaCEP", function(resultadoCEP){
                // console.dir(CEP.responseViaCEP)
                resolve(resultadoCEP)
            })
        }
    ).then((value) => { return value },
           (error) => { return new Error('CEP não encontrado.') } )
}

'callbackRequestViaCEP' 函数只有在我声明它而不使用 let、var 或 const 时才可用。现在我知道它会发生,因为一旦你不使用它们,变量就会进入全局 escope。我不确定这是否是最好的策略,如果不是,我希望你们让我知道,但现在这是我找到的唯一方法。

顺便说一下,这是我第一次看到它发生,觉得它很酷:)