Javascript - 函数声明之间的区别

时间:2017-04-13 09:01:41

标签: javascript scope execution

我刚刚开始使用Javascript开发,并且已经阅读了范围和执行上下文。我想知道这是否有区别:

function fun1 () {
    var x = 1;

    function fun2 () {
         x = x*2;
         alert(x);
    }
}

function fun1 () {
    var x = 1;
    fun2(x);
}

function fun2 (x) {
    x = x*2;
    alert(x);
}

是否有理由使用其中一个?它们是否具有任何性能/安全隐患(或对初学JS开发人员的其他意外影响)?

3 个答案:

答案 0 :(得分:2)

主要区别在于,第一种情况fun2仅在fun1范围内可用。在第二种情况下,两个函数都将在范围内可用,其定义为

答案 1 :(得分:0)

在Javascript范围内由封闭函数定义。也就是说,函数内定义的代码在函数外部是不可见的。

因此,在您的第一个示例中,func2定义在func1内,因此func1内仅显示

在你的第二个例子中,它在全局范围(window对象,在浏览器中运行时)中定义,因此可以从任何地方调用,就像func1一样。

答案 2 :(得分:0)

如果我们谈论您的第一种方法,则无法调用fun2,因为您已将其括在fun1内且其范围是本地的。不过,您可以按照以下方式修改fun1致电fun2

 var fun1 = (function(){

    var x = 1;

    var fun2 = function(){
         x = x*2;
         alert(x);
    };

    return {
      fun2: fun2
    }

 })();

以上返回语句会使您的fun2作为public范围,您可以使用fun1对象调用它,如下所示:

  fun1.fun2();
  

请注意,x变量是私有的,只能在fun1函数中访问。如果您需要使用fun1.x访问它,则必须在我fun1返回fun2时将其返回。

这称为modular or enclosed pattern。通过这个我们可以实现封装。

如果我们谈论您的第二种方法,即非常简单,您的fun1会致电fun2。我希望,它清除了这个概念。