变量声明是否升至if范围块的顶部?

时间:2019-05-31 20:25:50

标签: javascript

在if块作用域内用关键字var声明的变量发生提升时,(var x;)是否提升到当前if块的顶部?还是在这种情况下位于全球范围的顶端? 假设我们直接在全局范围内编写了以下代码

if (true) {
   some code;
   var x = 1;
}

3 个答案:

答案 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');
}