摘要:然而,引擎很可能虽然这要看具体实现将会仍然将这个结构保持一段时间,因为函数在整个作用域上拥有一个闭包。
内容
平时编写代码的时候很少关注细节,对javascript深层也没具体了解,下面针对平时写代码的形式分析、调整完善自己的代码,这里以一个简单例子分析js作用域和垃圾回收机制,通过块级作用域处理一些细节,提升自己代码性能。
普通案例在日常中最常见的代码编写方式:
function do(arg) { // 做一些事情 } var doFunc = {...} do(doFunc); var btn = document.getElementById( "my_button" ); btn.addEventListener( "click", function click(evt){ console.log("button clicked"); });
这样编写形式的代码很多,很多时候在编写的时候也没留意这些问题,功能倒是能实现,代码量少的时候没事,但是当代码量大,事关代码性能,那就是两码事了。
简单分析这里可以看到btn的点击事件和doFunc根本没什么关系。这意味着从理论上讲,在 do(..) 运行之后,这个消耗巨大内存的数据结构可以被作为垃圾回收。然而,JS引擎很可能(虽然这要看具体实现)将会仍然将这个结构保持一段时间,因为click函数在整个作用域上拥有一个闭包。
处理方法在日常编写代码中巧用块儿作用域可以解决这个问题,我们主动让js引擎清楚的知道它不必要再保存doFunc。
function do(arg) { // 做一些事情 } { let doFunc = {...} do(doFunc); } var btn = document.getElementById( "my_button" ); btn.addEventListener( "click", function click(evt){ console.log("button clicked"); });
声明可以将变量绑定在本地的明确的块儿是一种强大的工具,结合自己的代码,合理使用,一步步改善自己的代码。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/96432.html
摘要:作用域分类作用域共有两种主要的工作模型。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套。词法作用域词法作用域中,又可分为全局作用域,函数作用域和块级作用域。 一篇巩固基础的文章,也可能是一系列的文章,梳理知识的遗漏点,同时也探究很多理所当然的事情背后的原理。 为什么探究基础?因为你不去面试你就不知道基础有多重要,或者是说当你的工作经历没有亮点的时候,基础就是检验你好坏的一项...
摘要:关于循环和闭包当循环和闭包结合在一起时,经常会产生让初学者觉得匪夷所思的问题。闭包是一把双刃剑是比较难以理解和掌握的部分,它十分强大,却也有很大的缺陷,如何使用它完全取决于你自己。 在谈闭包之前,我们首先要了解几个概念: 什么是函数表达式? 与函数声明有何不同? JavaScript查找标识符的机制 JavaScript的作用域是词法作用域 JavaScript的垃圾回收机制 先来...
摘要:语句中的块语句对来说,将会指定对象添加到作用域链中。在严格模式下,初始化未经声明的变量会导致错误。查询标识符搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。 本文记录了我在学习前端上的笔记,方便以后的复习和巩固。 4.1基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型指的是简单的数据段,而引用类型值指那些可...
摘要:不是引用类型,无法输出简而言之,堆内存存放引用值,栈内存存放固定类型值。变量的查询在变量的查询中,访问局部变量要比全局变量来得快,因此不需要向上搜索作用域链。 赞助我以写出更好的文章,give me a cup of coffee? 2017最新最全前端面试题 基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空...
阅读 2950·2021-10-19 11:46
阅读 958·2021-08-03 14:03
阅读 2912·2021-06-11 18:08
阅读 2850·2019-08-29 13:52
阅读 2692·2019-08-29 12:49
阅读 453·2019-08-26 13:56
阅读 909·2019-08-26 13:41
阅读 832·2019-08-26 13:35