Javascript - 函数声明之间的区别

Javascript - Difference between function declarations

我刚刚开始在 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);
}

是否有理由使用一个而不是另一个?它们是否有任何 performance/security 影响(或对初学者 JS 开发人员的其他意想不到的影响)?

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

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

因此,在您的第一个示例中,func2func1 中定义,因此 func1 中可见。

在您的第二个示例中,它是在全局范围内定义的(window 对象,当在浏览器中 运行 时),因此可以从任何地方调用,就像 func1.

如果我们谈论您的第一种方法,则无法调用 fun2,因为您已将其包含在 fun1 中并且其作用域是局部的。但是,您可以修改 fun1 以调用 fun2,如下所示:

 var fun1 = (function(){

    var x = 1;

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

    return {
      fun2: fun2
    }

 })();

上面的 return 语句将使您的 fun2 成为 public 范围,您可以使用 fun1 对象调用它,如下所示:

  fun1.fun2();

Please note that the x variable is private and only accessible within fun1 function. If you need to access it using fun1.x, you will have to return it in your fun1 as I've returned fun2.

这叫做modular or enclosed pattern。这样我们就可以实现封装。

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