请在javascript中解释此代码的行为

时间:2014-12-08 06:56:43

标签: javascript scope

我用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块中。

5 个答案:

答案 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)

  • 首先,您要检查函数中变量i的值
  • 如果条件检查i的值,如果它是2则它将函数赋值给变量m函数返回1
  • 如果i的值不是2,则将函数赋值给变量m函数返回2
  • 最后你调用m返回2或1。
  

我的变量在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中发生变化,此行为将被正确定义。