问题描述
const
中 javascript
的一个关键特性是,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
重新声明一个不会导致错误,使用 let
和 const
这样做)。
对函数的每次调用都会创建一个新的作用域。
在该范围内仍然只有该变量的一个实例。
,它只在您拥有的每个作用域中声明一次,如果 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,您将无法在函数作用域中设置具有相同标识符的变量。