$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中的问题吗?
答案 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
语句。它们的范围限定为当前的执行上下文。有全局执行上下文,然后当一个函数运行时,它创建它自己的执行上下文。在函数内部,您创建了变量y
和i
。在y
语句中创建if
并不重要,因为一旦运行,y
就会在函数范围内创建。那么你做y.toString()
,它可以访问y
,因为它的范围是函数而不是if语句。这就是你获得1
输出的原因。这不是一个错误,它是设计的。