我用javascript编写了一个代码,如
function onClic(){
var i = 0;
if ( i==2 ){
var m = function(){
return 1;
}
}
else {
var m = function(){
return 2;
}
}
alert(m());
}
警报显示2;
请你解释一下这个陈述中的行为,即当我在If语句范围内声明它时,为什么我能够在If语句之外访问m。 另外为什么这个工作为ECMAScipt 5指定我们不要把函数声明放在IF-ElSE块中。
答案 0 :(得分:0)
您的变量i在函数开始时设置为0。你永远不会改变它。如果i等于2,则IF语句正在测试;事实并非如此。所以它跳转到ELSE语句,并返回2.
如果你想要它做某事,你永远不会以某种方式改变你的价值,这对你试图解决的问题是有意义的。
答案 1 :(得分:0)
function onClic(){
var i = 0;// set i=0
if ( i==2 ){ // so this condition always give false and control go to else statement
var m = function(){
return 1;
}
}
else {
var m = function(){
return 2;
}
}
alert(m());
答案 2 :(得分:0)
刚看到你实际问的是什么。
该变量仍在onClic()函数内部,因此即使它在if语句中,它仍然在本地范围内。
答案 3 :(得分:0)
我的变量在If语句的范围内然后我怎么能 在上一轮中将其值超出范围
答案是在js中你没有块级范围,你有全局范围或本地范围。在这里,我是本地可变的,因此可以在此功能的任何位置访问
答案 4 :(得分:0)
当我在If语句范围内声明它时,为什么我能够在If语句之外访问m。
因为JavaScript(至少ES5,只有功能范围,而不是阻止范围。if
语句不会创建范围。您的代码相当于:
function onClic(){
var i = 0;
var m; // m is "hoisted"
if ( i==2 ){
m = function(){
return 1;
}
}
else {
m = function(){
return 2;
}
}
alert(m());
}
另外为什么这个工作为ECMAScipt 5指定我们不要把函数声明放在IF-ElSE块中。
是的,但你所拥有的是功能表达式,而不是声明。函数声明类似于
function foo() { }
函数表达式可以放在表达式有效的任何地方。
虽然你是对的,根据规范,函数声明不能在块内使用,浏览器仍然允许它并实际产生不同的结果。在Firefox和Chrome中运行:
function foo() {
alert(1);
}
if (false) {
function foo() {
alert(2);
}
}
foo();
但是,这将在ES6中发生变化,此行为将被正确定义。