在嵌套函数中使用var关键字

3

我发现自己经常编写嵌套函数的函数。

在这样做时,我喜欢使用这种模式,因为我发现它们易于在eclipse大纲视图中再次找到。

var outer_func = function(){

  var inner_func1 = function(){
  //code
  }
  var inner_func2 = function(){
  //code
  }

}

我的问题是:如果我从嵌套/内部函数中省略var关键字,是否存在作用域差异?
感谢任何建议。
3个回答

1

是的,当外部函数被执行时,“内部”函数将变为全局函数。一般来说,最好使用函数声明,因为它们会首先被处理。

function outer() {
  function inner() {
  }
  ...
}

只有在稍后需要定义函数的情况下才使用表达式,例如基于稍后才知道的某些条件。


1

函数是它们自己的域,局部变量仅在执行堆栈下暴露出来(或者大多数人所说的谚语“作用域”)。如果一个变量被声明为非局部变量(即不是局部的),它会直接进入 window(全局)对象,并且在函数完成后不会被垃圾回收。例如:

function somefunc(){
   var a;
   function nested(){
      a=2;//this will edit parent function's variable a
   }
   function anothernested(){
      var b=5;//this will create local variable in nested function
      c=3;//this will create global variable
   }
   nested();
   console.log(a);
}

请仅使用与ECMA-262相关的术语。滥用行话只会让人困惑(“自己的领域”,“向下执行堆栈”,“局部性”等)。你要找的词是作用域 - RobG
谢谢,问题已解决,但是“stack”是完全有效的。例如,这个网站就是以它命名的。 - TERMtm
是的,执行上下文形成一个栈。作用域包括堆叠的词法环境的变量,但可能包括其他变量,例如使用闭包和with语句)。栈也被用作控制机制来确定函数返回的位置。在这种情况下,它与作用域完全不同(例如,被调用的函数无法访问调用它们的函数的变量,它们在同一个栈中但具有不同的作用域)。 - RobG
好的,我投降了,谢谢信息。 - TERMtm

1
如果省略内部的var关键字,那么你将会创建名为inner_func1inner_func2的全局函数。请保留var

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接