Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将函数嵌套在彼此之间是一种不好的做法吗?_Javascript_Jquery_Function_Nested - Fatal编程技术网

Javascript 将函数嵌套在彼此之间是一种不好的做法吗?

Javascript 将函数嵌套在彼此之间是一种不好的做法吗?,javascript,jquery,function,nested,Javascript,Jquery,Function,Nested,在嵌套函数中嵌套函数的缺点是什么 下面是一个例子: JS/jQuery: function one() { // do something function two() { // do something function three() { // do something function four() { // do something

在嵌套函数中嵌套函数的缺点是什么

下面是一个例子:

JS/jQuery:

function one() {

    // do something

    function two() {

        // do something

        function three() {

            // do something

            function four() {

                // do something

            }

        }

    }
}

声明嵌套函数的一个
缺点是,每次调用
parent
函数时,它都会在函数的环境中创建

function one() {
  var a = 1;
  two(); // a = 1
}

function two() {  
  var b = 2;
  three(); // b = 2
}

function three() {
  var c = 3;
  four(); // c = 3
}  

function four() {
  a = 4;
  b = 4;
  c = 4;
}
理论上,如果频繁调用
parent
函数,这可能会
降低性能

但是,嵌套函数在
javascript
中非常常用。例如,
closures
非常强大,应该为所有javascript开发人员所理解


阅读有关
闭包的更多信息,

嵌套函数可以访问其父作用域,因此您可以从深度嵌套函数更改父作用域中的状态。比如说

function one() {
  var a = 1;
  two(); // a = 4

  function two() {  
    var b = 2;
    three(); // b = 4

    function three() {
      var c = 3;
      four(); // c = 4

      function four() {
        a = 4;
        b = 4;
        c = 4;
      }
    }  
  }
}
一方面,这是相当强大的。另一方面,它很容易变得草率和难以推理,因为您必须确保任何子函数都没有更改其任何父函数中的值

如果坚持不嵌套函数,就不必担心函数内部的状态正在从嵌套函数内部更改

function one() {
  var a = 1;
  two(); // a = 1
}

function two() {  
  var b = 2;
  three(); // b = 2
}

function three() {
  var c = 3;
  four(); // c = 3
}  

function four() {
  a = 4;
  b = 4;
  c = 4;
}

不,这一点都没有错,在js中,这通常是一件好事。如果内部函数依赖于闭包变量,则它们可能不是。如果您不需要闭包或不需要担心污染名称空间,请将其作为同级编写。如果您需要一个闭包或不想污染名称空间,请嵌套它。嵌套与堆栈无关。@SLaks,谢谢您的观点。