Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不使用var、let或const有什么用处吗?_Javascript - Fatal编程技术网

Javascript 不使用var、let或const有什么用处吗?

Javascript 不使用var、let或const有什么用处吗?,javascript,Javascript,我看了大量关于“无风险”主题的问题/答案,但我仍然感到困惑 “no var”将查找范围链,直到找到变量或 点击全局范围(在该点创建) 我明白了,但是如果“no-var”确实找到了什么,它会做什么呢?e、 g如果您想更改现有变量或绑定,是否再次使用var/let,或者如果不使用,是否可以?有区别吗?如果没有var,let或const语句的用法如下: x = 100; 如果变量被分配到全局作用域,或者在作用域中找到它的位置被重新分配,那么通常情况下,这并不是期望的行为,因为这会导致作用域中的混乱,

我看了大量关于“无风险”主题的问题/答案,但我仍然感到困惑

“no var”将查找范围链,直到找到变量或 点击全局范围(在该点创建)


我明白了,但是如果“no-var”确实找到了什么,它会做什么呢?e、 g如果您想更改现有变量或绑定,是否再次使用var/let,或者如果不使用,是否可以?有区别吗?

如果没有
var
let
const
语句的用法如下:

x = 100;
如果变量被分配到全局作用域,或者在作用域中找到它的位置被重新分配,那么通常情况下,这并不是期望的行为,因为这会导致作用域中的混乱,或者变量重写,从而导致奇怪的错误

要在作用域中的任何位置重新分配变量,请使用与上述相同的方法:

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;
})();

只有在您选择的范围内初始化变量时,才使用
var
let
。但请记住,用于变量初始化的
let
关键字仅适用于ECMAScript 2016及更高版本。还有
const
关键字。
let
const
之间的区别在于,第一个是变量(其值可以更改),第二个是常量(其值不能更改,它是固定值)


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

简短的回答是否定的,在现代JavaScript中不存在

过去JavaScript的粗略设计的一个特点是,不管您是否有意,变量都是自动创建的

这意味着以下代码:

apple=3;
Apple=apple+4;
alert(apple);
将导致创建两个变量(JavaScript,当然是区分大小写的),并且代码中会出现逻辑错误

在现代代码中,您应该以
'use strict'
指令开始,该指令将禁止未声明的变量:

'use strict';
var apple=3;
Apple=apple+4;  //  error: undeclared Apple
alert(apple);
“严格使用”
有助于缩小导致代码草率且难以管理的差距。当尝试分配给未声明的变量时,它将引发错误

var
关键字有两个作用。首先,它声明变量,从而通知JavaScript解释器它是故意的。其次,它还设置变量的作用域——该作用域将是声明变量的包含环境的作用域,通常是一个函数

甚至更现代的JavaScript还添加了
const
,它锁定了原本是变量(只读变量)的值,并添加了
let
,使变量的作用域更加有限

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


在我看来,任何发现声明变量太难的人都会有一个糟糕的开始,可能不应该编写JavaScript。

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

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。我不确定这是否是最好的策略,如果不是,我希望你们能让我知道,但现在这是我找到的唯一可行的方法


顺便说一句,这是我第一次看到它发生,发现它很酷:)

如果你不使用
var
关键字,那么你的变量驻留在全局(窗口)范围内如果我在函数中局部使用var weather=“cloudy”,然后在同一个函数中键入weather=“sunny”,会怎么样?它是全局的吗?`var weather=“cloudy”`您定义了一个变量,当您执行`weather=“sunny”`时,如果我这样使用它,您将更新变量值:var x=100;然后我写x=101,它仍然是一个“var”还是成为全局变量?如果
x=101
在声明
x
的范围内,因此它将保持为局部变量。如果
x=101
在其定义的父范围内,将分配给全局范围。因此,在原始定义的局部范围或子范围中不使用var/let实际上可以吗?什么都不会出错?那要看情况了。一般来说,使用全局范围是非常糟糕的做法。另一方面,使用父范围中的变量是编码实践;)如果需要,您可以在顶级作用域中保留一个空变量,
let callbackRequestViaCEP