作用域

JS作用域

假如想象 提交于 2019-11-28 05:48:29
作用域:变量可以起作用的范围 全局变量和局部变量 全局变量 在任何地方都可以访问到的变量就是全局变量,对应全局作用域 局部变量 只在固定的代码片段内可访问到的变量,最常见的例如函数内部。对应局部作用域(函数作用域) 不使用var声明的变量是全局变量,不推荐使用。变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁 块级作用域 任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。 在es5之前没有块级作用域的的概念,只有函数作用域 ,现阶段可以认为JavaScript没有块级作用域 词法作用域 变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。 在 js 中词法作用域规则: 函数允许访问函数外的数据. 整个代码结构中只有函数可以限定作用域. 作用域规则首先使用提升规则分析 如果当前作用规则中有名字了, 就不考虑外面的名字 var num = 123;function foo() { console.log( num );}foo();​if ( false ) { var num = 123;}console.log( num ); // undefiend 作用域链 只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域,

js预解析

徘徊边缘 提交于 2019-11-28 05:48:24
在ES6之前,变量使用 var 声明,会存在变量的预解析(函数也有预解析)。ES6引了 let 和 const ,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写的,要想得心应手的维护之前的代码个人感觉还是很有必要了解下js的预解析机制。 一、变量和函数在内存中的存在形式 JavaScript中的变量类型和其他语言一样,有基本数据类型和引用数据类型。基本数据类型包括: undefined 、 null 、 boolean 、 String 、 Number ;引用数据类型主要是对象(包括{}、[]、/^$/、Date、Function等)。 var num = 24; var obj = {name:'iceman' , age:24}; function func() { console.log('hello world'); } 以上的代码在内存中的模型为: 内存模型.png 基本数据类型按照值来操作,引用数据类型按照地址来操作。 基本类型在栈区: 引用数据类型: 基本类型是直接存储在栈内存中,而对象是存储在堆内存中,变量只是持有该 对象的地址 。所以obj持有一个对象的地址oxff44,函数func持有一个地址oxff66。 在以上的代码的基础上再执行: console.log(func); console.log(func(

JavaScript性能优化

▼魔方 西西 提交于 2019-11-28 05:44:56
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度。 这种情况下决定程序速度的另一个重要因素就是代码本身。 在这里我们会分门别类的介绍JavaScript性能优化的技巧,并提供相应的测试用例,供大家在自己使用的浏览器上验证, 同时会对特定的JavaScript背景知识做一定的介绍。 目录 变量查找优化 变量声明带上var 慎用全局变量 缓存重复使用的全局变量 避免使用with 核心语法优化 通过原型优化方法定义 避开闭包陷阱 避免使用属性访问方法 避免在循环中使用try-catch 使用for代替for…in…遍历数组 使用原始操作代替方法调用 传递方法取代方法字符串 脚本装载优化 使用工具精简脚本 启用Gzip压缩 设置Cache-Control和Expires头 异步加载脚本 DOM操作优化 减少DOM元素数量 优化CSS样式转换 优化节点添加 优化节点修改 减少使用元素位置操作 避免遍历大量元素 事件优化 使用事件代理 动画优化 设置动画元素为absolute或fixed 使用一个timer完成多个元素动画 变量查找优化 变量声明带上var 1. 如果声明变量忘记了var,那么js引擎将会遍历整个作用域查找这个变量,结果不管找到与否,都是悲剧。 如果在上级作用域找到了这个变量,上级作用域变量的内容将被无声的改写

JavaScript性能优化

痴心易碎 提交于 2019-11-28 05:43:54
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度。 这种情况下决定程序速度的另一个重要因素就是代码本身。 在这里我们会分门别类的介绍JavaScript性能优化的技巧,并提供相应的测试用例,供大家在自己使用的浏览器上验证, 同时会对特定的JavaScript背景知识做一定的介绍。 目录 变量查找优化 变量声明带上var 慎用全局变量 缓存重复使用的全局变量 避免使用with 核心语法优化 通过原型优化方法定义 避开闭包陷阱 避免使用属性访问方法 避免在循环中使用try-catch 使用for代替for…in…遍历数组 使用原始操作代替方法调用 传递方法取代方法字符串 脚本装载优化 使用工具精简脚本 启用Gzip压缩 设置Cache-Control和Expires头 异步加载脚本 DOM操作优化 减少DOM元素数量 优化CSS样式转换 优化节点添加 优化节点修改 减少使用元素位置操作 避免遍历大量元素 事件优化 使用事件代理 动画优化 设置动画元素为absolute或fixed 使用一个timer完成多个元素动画 变量查找优化 变量声明带上var 1. 如果声明变量忘记了var,那么js引擎将会遍历整个作用域查找这个变量,结果不管找到与否,都是悲剧。 如果在上级作用域找到了这个变量,上级作用域变量的内容将被无声的改写

js的预解析和作用域

若如初见. 提交于 2019-11-28 05:34:27
预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作。这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数。 1.寻找 var function 参数 等关键字,根据var a提前设置为 a=未定义(undefined) ,所有的变量,在正式运行前都提前赋值了一个未定义。 2.函数在正式运行代码前,都是整个函数块。fn1=function fn1(){alert(2);} 执行js代码一般分两步:1.预解析代码。 2.逐行执行代码。 var a = 1; var b;// c = 3;// function d(){//用声明的方式声明的函数 console.log('hello'); } var e = function(){//函数表达式 console.log('world'); } 强调:1、预处理的函数必须是JS中用声明的方式声明的函数(不是函数表达式) 当变量和函数重名时:就只留下函数的值,不管顺序谁前谁后。所以函数的优先级比变量高。注意:这只是预解析。 当函数和函数重名时:会留下后面那个,会遵循上下文机制。 预解析后会正常的读取代码(由上至下) 下面举例说明一下预解析: var fn=456; function fn(){ console.log('123') }

let const

梦想的初衷 提交于 2019-11-28 05:04:32
let 和 const 命令 1. let命令 基础使用 let声明的变量只在它所在的代码块有效。 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6 上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量. 另外,==for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域==。 不存在变量提升 console.log(bar); // 报错ReferenceError let bar = 2; 暂时性死区 (temporal dead zone,简称 TDZ) 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 var tmp = 123; if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }

python函数参数、参数解构、作用域、递归及匿名函数

末鹿安然 提交于 2019-11-28 01:45:56
一、python函数 由若干语句组成的语句块,函数名称,参数列表构成,它是组织代码的最小单元,通过函数完成一定的功能 1、函数的作用 结构化编程对代码的最基本封装,一般按照功能组织一段代码 封装的目的是为了功能复用,减少冗余代码 使代码更加简洁美观,可读易懂 2、函数的分类 内建函数,如:max(),reversed()等 库函数,如math.ceil()等 3、函数的定义和调用 定义 def语句定义函数 函数名就是标识符,命名要求一样 语句块必须缩进,约定4个空格 python的函数若没有return语句,隐式会返回一个None值 定义中的参数列表成为形式参数,只是一种符号表达,简称形参 调用 函数定义只是声明了一个函数,它不会被执行,需要调用 调用方式,就是函数名加上小括号,括号内写参数 调用时写的参数是实际参数,是实实在在的传入的值,简称实参 二、函数参数 参数调用时传入的参数要和定义的个数相匹配(可变参数例外) 位置参数:按照参数定义顺序传入实参fn(1,2) 关键字参数:使用形参的名字来传入实参的方式,如果使用了形参名字,那么传参顺序就可以随意fn(x=1,y=1) 传参:要求位置参数必须在关键字参数之前传入,位置参数是位置对应的; 1、函数参数默认值 参数的默认值可以在未传入足够的实参的时候,对没有给定的参数赋值为默认值 参数非常多的时候

C语言中static extern的使用

ⅰ亾dé卋堺 提交于 2019-11-28 01:32:28
10:30:22 2019-08-20 基础不牢 瞬间爆炸 参考资料: https://blog.csdn.net/ts_54eagle/article/details/4418627 https://blog.csdn.net/xingjiarong/article/details/47656339 https://blog.csdn.net/xingjiarong/article/details/47656339 看看C Primer Plus上是怎么定义的 先说说作用域 分为4种:块作用域 函数作用域 函数原型作用域 文件作用域 这里要说明的是 块作用域指{}之间的部分 而函数作用域单单指goto标签 当goto标签出现在函数内部时 goto标签作用域蔓延至整个函数 函数原型作用域从形参定义到原型声明结束为止 文件作用域指的是 该文件 该文件 该文件 从变量定义到文件末尾都可见 链接分为3种:外部链接 内部链接 无链接 (决定了是否能被外部文件使用) 块作用域 函数作用域 函数原型作用域的变量 都属于无链接 文件作用域的变量 可以属于外部链接 也可属于内部链接 内部链接的文件作用域 称为 文件作用域(只能在该文件内部使用) 外部链接的文件作用域 称为 全局作用域(整个程序都可使用) 一个具有文件作用域的变量默认是具有全局作用域的 在前面加上static变为具有文件作用域

HTML基础之JS

末鹿安然 提交于 2019-11-28 01:27:53
TML中的三把利器的JS 又称为JavaScript,看着好像和Java有点联系,实际上他和java半毛钱关系都没有,JavaScript和我们学习的Python、Go、Java、C++等,都是一种独立的语言,Python的解释器有Python2.7、Python3.x,浏览器具有解释JavaScript的功能,所以它才是HTML的三把利器之一。 在HTML中可以将JavaScript/JS的代码写在head中,被script标签所包裹,当浏览器解释HTML时,遇到style标签时,按照CSS规则解释,遇到Script标签时,按照JavaScript的语法规则解释。 引入JavaScript代码,类似于Python的import <script src="public.js" type="text/javascript"></script> head中引入JS与body中引入JS区别 html代码从上而下解析,如果在head中引入JS,影响页面打开的速度,存在风险,所以通常放在htmlbody的最下方,这样页面内容先展示,最后在加载JS。注:写在最下面要有底线,写在body内部的最底下。 注释 单行注释通过 // 多行通过 /* */ JS变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 es5 name = 'dsx' ; / / 默认全局变量

闭包和作用域

╄→尐↘猪︶ㄣ 提交于 2019-11-28 00:57:55
作用域 区别1 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时 全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建 函数执行上下文是在调用函数时, 函数体代码执行之前创建 区别2 作用域是静态的, 只要函数定义好了就一直存在, 且不会再变化 执行上下文是动态的, 调用函数时创建, 函数调用结束时就会自动释放 联系 执行上下文(对象)是从属于所在的作用域 全局上下文环境==>全局作用域 函数上下文环境==>对应的函数使用域 闭包 如何产生闭包? 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包 闭包到底是什么? 使用chrome调试查看 理解一: 闭包是嵌套的内部函数(绝大部分人) 理解二: 包含被引用变量(函数)的对象(极少数人) 注意: 闭包存在于嵌套的内部函数中 产生闭包的条件? 函数嵌套 内部函数引用了外部函数的数据(变量/函数) 常见的闭包 将函数作为另一个函数的返回值 将函数作为实参传递给另一个函数调用 闭包的作用 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期) 让函数外部可以操作(读写)到函数内部的数据(变量/函数) 闭包的应用 : 定义JS模块 具有特定功能的js文件 将所有的数据和功能都封装在一个函数内部(私有的)