在javascript中重新声明const变量

问题描述

constjavascript一个关键特性是,const 变量不能声明两次。 所以在这个从 [this][1] 链接获取代码

signalServer.on('discover',(request) => {
  const clientID = request.socket.id // clients are uniquely identified by socket.id
  allIDs.add(clientID) // keep track of all connected peers
  request.discover(Array.from(allIDs)) // respond with id and list of other peers
})

每次有新客户端通过套接字连接到服务器时,都会创建新的 const clientID = request.socket.id。所以 clientID 变量被创建了不止一次,尽管它是 const。 这怎么可能? [1]:https://github.com/t-mullen/simple-signal

解决方法

一个变量名在一个作用域中只能存在一次。 (使用 var 重新声明一个不会导致错误,使用 letconst 这样做)。

对函数的每次调用都会创建一个新的作用域。

在该范围内仍然只有该变量的一个实例。

,

它只在您拥有的每个作用域中声明一次,如果 clientID 在外部作用域中,让我们与 signalServer 一起说,那么它将按照您认为的方式工作

,

这个常量只存在于回调函数块中。函数执行后,常量从内存中卸载。

,

include 'vendor/autoload.php'; $connect = mysqli_connect('localhost','root','','excel_import_db'; if($_FILES["import_excel"]["name"] != '') { $allowed_extension = array('xls','csv','xlsx'); $file_array = explode(".",$_FILES["import_excel"]["name"]); $file_extension = end($file_array); if(in_array($file_extension,$allowed_extension)) { $file_name = time() . '.' . $file_extension; move_uploaded_file($_FILES['import_excel']['tmp_name'],$file_name); $file_type = \PhpOffice\PhpSpreadsheet\IOFactory::identify($file_name); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($file_type); $spreadsheet = $reader->load($file_name); unlink($file_name); $data = $spreadsheet->getActiveSheet()->toArray(); foreach($data as $row) { $query = " INSERT INTO sample_datas (`first_name`,`last_name`,`created_at`,`updated_at`) VALUES ('".$row[0]."','".$row[1]."','".$row[2]."','".$row[3]."') "; $statement = mysqli_query($connect,$query); } $message = '<div class="alert alert-success">Data Imported Successfully</div>'; } else { $message = '<div class="alert alert-danger">Only .xls .csv or .xlsx file allowed</div>'; } } else { $message = '<div class="alert alert-danger">Please Select File</div>'; } echo $message; 是块范围的 const - JavaScript | MDN

在代码片段中,每次触发 const 事件后调用回调函数时,都会为回调函数创建一个新的执行上下文。

discover 的范围被限制在 const clientID 内,它只被分配一次。

,

据我所知,如果函数中的变量在函数作用域中声明,则它们始终是临时的。所以即使它是一个 const 它仍然是临时的,因为它是在一个函数中声明的。但是,您将无法声明具有相同标识符的不同变量。所以说 const x 和后来说 let x 是不可能的。如果您在函数作用域之外识别了 const x,您将无法在函数作用域中设置具有相同标识符的变量。