在if块作用域内用关键字var声明的变量发生提升时,(var x;)是否提升到当前if块的顶部?还是在这种情况下位于全球范围的顶端? 假设我们直接在全局范围内编写了以下代码
if (true) {
some code;
var x = 1;
}
答案 0 :(得分:1)
按照您的示例使用var
(或完全省略定义键,例如仅x = 1
)时,它将被提升到最接近的范围,在您的示例中将是全局范围({ {1}}。
如果将其包装在函数中,则该函数将是最接近的作用域。
window
如果您希望变量完全属于块范围,则需要使用function a() {
if(true){
var x=1;
}
console.log(x) // 1
console.log(window.x) // undefined
}
a()
console.log(x) // Throws error (x is not defined)
或let
。
const
答案 1 :(得分:0)
简短的回答是,是的,声明被吊起,但不在块的顶部。它被提升到全球水平。 但是分配的位置不变。
测试起来很棘手,因为未声明的变量和声明的变量都会产生typeof somevar
的{{1}}。
undefined
但是,如果您尝试使用已定义的变量,则会引发错误,因此我们可以使用它来查找已声明的内容和未声明的内容。
var myVar;
console.log('typeof myVar');
console.log(typeof myVar);
console.log('typeof notDeclared');
console.log(typeof notDeclared);
将它们放在一起,我们可以测试您的代码以查看会发生什么。
var myVar;
try {
myVar;
console.log('myVar was declared');
} catch(error) {
console.log(error);
}
try {
notDeclared;
console.log('notDeclared was declared');
} catch(error) {
// Error is unfortunately captured by the sandbox,
// so we just get an empty object. :-(
console.log(error);
}
答案 2 :(得分:0)
绝对。
<form method="POST" class="PesquisarData">
<h5>Pesquisar Data:</h5>
<input type="text" id="data" name="data" class="selectData">
<input type="submit" value="Pesquisar" class="buttonData"><br/>
</form>
if (!empty($_POST['data'])) {
$_POST['disciplina'] = "";
$_POST['professor'] = "";
$data = explode('/', addslashes($_POST['data']));
$data = $data[2].'-'.$data[1].'-'.$data[0];
$sqlm = "SELECT * FROM {$pfx}Material WHERE Data LIKE CONCAT('%',?,'%') ORDER BY Data DESC";
$qrym = $conn->prepare($sqlm);
$qrym->bindParam(1, $data);
$qrym->execute() or die('Ocorreu um erro em uma operação do banco de dados: VL0002.2');
}