写在前面

听闻大佬们在写一些框架或者库的时候,到处都隐藏了一些细节,所以阅读他们的源代码,无论从性能优化、还是JS API的学习、亦或是代码风格等方面给到我们很多启发。这两天我翻看了一下jQuery1.x的源代码,看到了这么一段,着实让我觉得很细节,在这儿和大家分享一下。

不再废话,看代码

看上图,整个jquery的初始化做成被包裹在了一个自执行函数中,这很容易理解,因为自执行函数在执行时创建了自己的作用域,在jquery中声明的变量不小心污染全局空间的可能。

但令人疑惑的是,为什么这个自执行函数还会把window回想作为一个函数参数传进来呢?在自执行函数内部就能访问了window呀 ?

从作用域链谈起

解答上面的问题,其实也不难,这就要提到一个概念: “作用域链”。

JS中函数也是一个对象,函数拥有可以通过代码访问的属性和一系列仅供js引擎访问的内部属性。

其中一个内部属性是[[scope]]。该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问 函数被创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量。

执行函数时,会创建一个称为‘运行期上下文’的内部对象,运行期上下文定义了函数执行的环境。每个运行期上下文都有自己的作用域链,用于标识符解析。在解析这些标识符时,JS引擎会沿着自己的作用域链,逐步地往上查找,找到标识符,则停止。

知道了作用域链的查找原理,那么上面的问题也就好回答了:

之所以要把window对象传入自执行函数,是因为jquery源码中,应该存在较多的对window对象的引用,此时就应当把window对象置于作用域链的头部,这样就避免了需要window对象时,需要跳过头部的作用域向上查找,这样有助于提升性能。

再说说 “with”

相信很多人在面试时都会被问到 “为什么不建议使用 with ?”

在这主要由两个原因:

  1. with 在严格模式下不能使用
  2. 第二点也就是跟我们上面提到的作用域链有关了。 with 会创建自己的所用域,使得作用域链增长,此时在 with 代码块内部访问外部的变量时,会造成一定的性能损失。

OK,上面就是我想给大家分享的内容。

过年啦!最后祝各位看到文章的朋友们涨薪涨不停!!!

jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...相关推荐

  1. 读完 Vue 发布源码,小姐姐回答了 leader 的提问,并优化了项目发布流程~

    大家好,我是若川.这是 源码共读 第三期活动,纪年小姐姐的第三次投稿.纪年小姐姐学习完优化了自己的项目发布流程,而且回答了leader对她的提问,来看看她的思考和实践. 第三期是 Vue 3.2 发布 ...

  2. 1号店案例html源码_手把手教一起写jQuery版mini源码,分析jQuery的优势

    适合人群 本文适合0.5~3年的前端开发人员,以及想了解jQuery是什么的小伙伴们. 前言 谈谈个人对jQuery的看法. 如果你是一个五年以上的开发人员,相信你一定认识了解jQuery.这好比你十 ...

  3. Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP)

    Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP) 说明:Java生鲜电商平台中,由于商品的架构很大程度决定了电商的扩展性与伸缩性.对此根据自己多年的生鲜电商经验,整理了以下的商品中 ...

  4. jQuery Event 模块 源码浅解

    众所周知,jQuery 通过jQuery.event.add & jQuery.event.remove 方法对DOM元素(文本和注释节点除外)进行事件的绑定和解绑.这两个方法都提供了四个参数 ...

  5. 大商创小程序源码_小程序直播系统有哪些基本功能

    小程序直播系统源码能够构建出高品质的直播平台,现如今较为流行的"直播间+电商.""直播间+教育"等新型的"直播间+"等多元化的直播间方向都不 ...

  6. 到家服务公司php源码,微信小程序-仿五洲到家商城源码

    微信小程序-仿五洲到家商城源码 微信小程序仿五洲到家商城源码是一款精仿五洲到家app界面的小程序源码,适用于各类小程序商城系统,功能及模块均值得借鉴! 对应功能模块 > * 首页(定位成功情况且 ...

  7. 短视频app源码、小视频源码存储功能如何实现?

    在短视频app源码(小视频源码)开发中,考虑到后期用户上传短视频时需要大量应用到存储功能,故而需要实现这一功能,具体需要怎么做呢,本文将以云豹短视频app源码为例,为大家进行讲解. 一.阅读前请注意: ...

  8. 【附源码】小程序初窥之简单查单词

    新年假期百无聊赖,于是就看了一下微信小程序的开发方法,花了两天时间入了个门,这里记录一下. 阅读之前,先确定你知道基本的 html+css+js 语法,这样就能更好地和我一样,以一个新手的视角来理解小 ...

  9. java离职证明模板_离职证明的一个小细节,差点让我「背调」over

    终于拿下了鹅厂的offer. 久战职场,深知诚信的重要性,不管是简历还是面试表述,都不敢有任何的弄虚作假,在等待背调结果的几天里,虽然有一些莫名的小紧张,整体上也是满满的坦荡自信:随便调查吧,我没什么 ...

最新文章

  1. 科大讯飞市值腰斩背后,AI产业集体思考如何落地?
  2. 10分钟带你入门git到github
  3. FFMPEG视音频编解码学习(1)
  4. android编程常见问题-程序真机中不显示
  5. 弱电工程室内外光纤敷设有哪些技术要求
  6. Oracle数据库的数据统计(Analyze)
  7. 6、struts.properties配置详解
  8. C# DataTable笔记
  9. 《ActionScript 3.0基础教程》——2.2 显示队列概述
  10. 企业网站管理系统php源码,云优CMS企业网站管理系统
  11. java flv 转swf_nginx-http-flv-module flv拉流错误整理
  12. “向死而生”的微信视频号,逆风翻盘的2020
  13. SHAP模型:可解释机器学习模型
  14. getSreenWH()
  15. laravel数据迁移
  16. espn配置路由_华为敏捷网络解决方案.ppt
  17. Unity使用Mysql(添/删/改/查)(保姆级)
  18. 科普:SAS是什么语言
  19. 黑莓Q10 bb10 系统 gba等模拟器 retroArch全教程
  20. 代码随想录算法训练营第七天

热门文章

  1. mysql boost 5.7.21_mysql 5.7.21 安装配置方法图文教程(window)
  2. 判断远程图片是否存在,否则替换成默认图片
  3. c语言如何输出无限小数,printf的格式控制(C语言)
  4. [蓝桥杯][2017年第八届真题]拉马车(String)
  5. Codeforces Round #572 (Div. 2)(ABCD1D2E)
  6. xshell连接服务器响应慢,Xshell 连接虚拟机很慢
  7. 报数退圈问题(C语言)
  8. linux wptmp文件分析,wordpress上传图片提示“缺少临时文件夹”的解决方法
  9. 为什么要学python-为什么要学 Python?
  10. java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园