在if块中访问变量

时间:2016-01-27 06:40:10

标签: javascript typescript

$filename = 'e:/e.jpg';

$fields = array('imageFile'=>$filename);

$fieldsQueryString = http_build_query($fields);

// you should have curl library install here 
$ch = curl_init("http://127.0.0.1/uploadapi/index.php/api/example/imageupload"); curl_setopt($ch, CURLOPT_POST, count($fields)); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldsQueryString);
curl_exec($ch);

如您所见,我在var func = function () { var i: number = 0; if (i == 0) { var y: number = 1; } document.body.innerHTML = y.toString(); // js/ts should complain me in this line }; func(); // output: 1 块内声明了变量y。所以,我认为它不能在范围之外被引用。

但是,当我尝试运行代码时,输​​出为if

是打字稿/ javascript中的问题吗?

5 个答案:

答案 0 :(得分:6)

Javascript中的变量是hoisted,这意味着var y被移动到函数的顶部,就像在那里声明它一样。

初始化但未提升,因此如果您将i更改为0以外的其他内容,则变量y仍将存在,但其值为{{1 }}

这意味着该功能完全等同于:

undefined

要获得您期望的行为,您需要使用let,这是ECMAScript 2015(ES6)的一部分。正如您所期望的那样,它是块作用域。它也将有效地工作,只有从定义开始才能访问它,这也可能正如你所期望的那样。

答案 1 :(得分:1)

如果你重新声明一个JavaScript变量,它就不会失去它的价值。

第二个引用可能为新的变量语法铺平了道路。实际上如果你还记得javascript中不需要变量声明。辛普

Y = 1;

也有效。

第二次引用y时,在if if之外,在我看来,它会尝试重新声明并保留旧值。

参考 - http://www.w3schools.com/js/js_variables.asp &安培; http://www.w3schools.com/js/js_scope.asp

答案 2 :(得分:1)

Javascript具有功能范围afaik。在函数内声明的任何变量都应该可以从函数内的任何地方访问。所以,如果你有一个函数检查i == 0,那么你可以实现你想要实现的目标。

答案 3 :(得分:1)

这是应该的。 Javascript按函数范围,而不是按块。 (这确实使它与许多流行语言不同)

声明为var myVar = 10;的变量将渗透到嵌套函数中,但不会反过来。声明为myVar = 10;的变量将变为全局变量。

我找不到任何暗示打字稿有任何不同的东西。

答案 4 :(得分:1)

if语句内声明的变量不限于if语句。它们的范围限定为当前的执行上下文。有全局执行上下文,然后当一个函数运行时,它创建它自己的执行上下文。在函数内部,您创建了变量yi。在y语句中创建if并不重要,因为一旦运行,y就会在函数范围内创建。那么你做y.toString(),它可以访问y,因为它的范围是函数而不是if语句。这就是你获得1输出的原因。这不是一个错误,它是设计的。