函数是否应该避免声明在函数中?

一个函数执行完成后其运行环境会被 GC 那么在其内声明的函数也会被 GC 掉吧(排除闭包情况)
那么下次再用时 嵌套函数会被重新声明 这是不是种浪费
如果函数不常用到还好 被释放掉还会节省内存 常用这种操作会不会造成多余的性能开销呢?~

阅读 4.3k
7 个回答

其实呢,如果你写过编译器就知道了。

解析器在第一次解析的时候可以缓存解析结果(如果写在外面就一直不能释放解析结果),解析器可以选择保存解析结果或是从重新解析。

JS里,一个函数其实算是一个对象,例如 {args:arglist,code:code,closure:closure} args 是形参列表,code 是函数体,closure 是执行环境,是闭包。。。其他的东西就先省略了。。。这里面code是不变的,args是不变的,不用每次重新解析。 实现的时候可以固定这一部分的值,每次需要“函数对象”的时候,把函数对象的对应属性指向这些值,只是需要重置 closure 而已。

其实题主心应该更高一点,比如看到这个一下子让我想起的 JavaScript Module,还不如好好关心一下它。

现代浏览器已经足够聪明来应付你的疑虑!

视情况而定 你想太多了

问题在于GC不是你想的立马会执行,他要是立马执行你的担忧就会成立,GC已经考虑到这个问题了。他设定了一定条件,满足了才会去GC的。所以执行的东西会有缓存这很合理。

是的,在es6的块级作用域中如果使用let 的方式提升声明一个函数容易出问题,如下将会报错:

{
    var fuc ;
    let fuc = function(){
    }
}
// Uncaught SyntaxError: Identifier 'fuc' has already been declared 

具体你可以看下 ES6 块级作用域 http://es6.ruanyifeng.com/#do...

不要想太多细节上的开销,这也是新手常常犯的错误。先把大局上的架构优化弄明白才是正道

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题