作用域

闭包(closure)

匿名 (未验证) 提交于 2019-12-02 21:53:52
闭包的形成与变量的作用域及生命周期密切相关,所以在理解闭包前,须理解变量作用域。作用域分全局和局部作用域,是指变量有效访问的范围。变量无权访问子作用域,只能访问自己和父级以上的作用域。 当函数执行时,会创建一个执行期上下文(即作用域)的对象AO(存储在 [[scope]] 中), 一个新的AO指向 定义了一个函数执行时的环境。 函数执行时对应的AO, 是独一无二的,每次调用函数就创建一个OA, 函数执行完毕 AO的指向就会销毁 [[scope]] : 每个函数都是对象,对象中有些属性可访问,有些不可以, [[scope]] 就不可访问,它存储了运行期上下文的集合( [GO,AO] )。 作用域链:就是 [[scope]] 中所存储的AO对象集合,呈链式链接 函数刚定义就存储了 所在环境的执行期上下文,执行时 创建自己的AO function fun ( a ){ console . log ( a ); // function var a = 123 ; function a (){}; console . log ( a ) // 123 函数声明已提升所以不用管 var b = function (){}; console . log ( b ); //function 因为是函数表达式,只提升了 变量b, 这样的函数体不会提升 } fun ( 1 ); //函数 123

从函数作用域和块级作用域看javascript的作用域链

匿名 (未验证) 提交于 2019-12-02 21:53:52
在ES6之前,javascript只有全局作用域和函数作用域。所谓作用域就是一个变量定义并能够被访问到的范围。也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这个变量定义在函数内部,那么就只能在函数内部访问到这个变量。 全局作用域只要页面没关闭就会一直存在 ,而 函数作用域只有在函数执行的时候才存在 ,执行完就销毁。且 每次执行函数都会创建一个新的作用域 。 那么什么是作用域链呢? 在了解作用域链之前,我们先了解一个执行期上下文的概念。 执行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象(即AO或GO), 一个执行期上下文定义了一个函数的执行环境 ,函数每次执行时对应的执行期上下文都是独一无二的,所以每次调用一个函数都会创建一个新的执行期上下文,当函数执行完毕,所产生的执行期上下文被销毁。 作用域链就是函数中[[scope]]属性所存储的执行期上下文对象的集合 ,这个集合呈链式链接,我们把这种链式链接叫做作用域链。 作用域链更像是一种包含的关系 。比如说函数A内部定义了一个函数B,所以B的定义是依赖于A的,也就是说B在A的内部,那么B中就可以访问A的中的变量和方法。这种一层一层向上依赖的关系就构成了作用域链。 为了更好理解,我们直接看例子。 var name = 'xiaoyu'; function fn1() {};

JavaScript 作用域 与 作用域链

匿名 (未验证) 提交于 2019-12-02 21:53:52
  本文是参照高程(JavaScript 高级程序设计)加上一些个人的理解和总结,使用简单的小例子和一些代码片段来尽量解释清楚作用域和作用域链。(本文适用于具备一些JS基础的朋友拿来参考) 执行环境与 函数的定义和执行   执行环境定义了变量或者函数有访问其他数据的权限 。在 JavaScript 中,有一个最外层的全局执行环境,在Web浏览器中,通常我们认为就是window这个对象。   通过一个小例子来解释一下在定义函数和执行函数分别发生了哪些事情。   从这张图中,我们能看出,当我们定义了一个函数 test1 时,     1、首先在堆内存中创建了一个Function对象,然后将地址存在 test1 中;     2、自动创建一个对象,并且该对象有一个 constructor 属性指向该函数本身,最后该函数对象的prototype属性指向这个对象;     3、将包括全局对象在内的,在函数执行过程中创建的活动对象(后文解释)都存在该函数自身的内部属性[[Scope]]上。   当执行一个函数(test1)时,     1、首先会创建一个执行环境ECS及相应的作用域链;     2、然后使用arguments和函数的参数(如果有)的值来初始化函数的活动对象(Active Object)也就是上面所说的活动对象;     其中,该函数对应的作用域链是通过取出[[Scope]]的值

let和const----你所不知道的JavaScript系列

匿名 (未验证) 提交于 2019-12-02 21:53:52
let 众所周知,在ES6之前,声明变量的关键字就只有var。 var 声明变量要么是全局的,要么是函数级的,而无法是块级的。 var a = 1 ; console . log ( a ); // 1 console . log ( window . a ); // 1 function test (){    var b = 2 ;    function print (){     console . log ( a , b );    } print (); } test (); // 1 2 console . log ( b ); // Uncaught ReferenceError: b is not defined for ( var i = 0 ; i <= 10 ; i ++ ){ var sum = 0 ; sum += i ; } console . log ( i ); // 11 console . log ( sum ); // 10 声明在for循环内部的i和sum,跳出for循环一样可以使用。 再来看看下面这个栗子: HTML : < ul > < li > 0 </ li > < li > 1 </ li > < li > 2 </ li > < li > 3 </ li > </ ul > JS : window . onload =

JavaScript 闭包

匿名 (未验证) 提交于 2019-12-02 21:53:52
这篇算接上一篇:【 JavaScript 预编译:函数声明提升,变量声明提升 】 这两篇都是因为看了这个视频,觉得讲的挺清楚的就记录下来了 说闭包之前我们先介绍几个概念: 当函数执行时(实际上是函数执行前一刻)会创建一个称为执行期上下文的对象(就是上一篇介绍的 Activation Object),一个执行期上下文定义了一个函数执行期间的环境。当函数执行完毕,它所产生的执行期上下文被销毁。 函数每次执行时对应的执行期上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文。 每个 JavaScript 函数都是一个对象,对象中有些属性我们可以访问,但有些不可以。不可以访问的这些属性仅供 JavaScript 引擎存取,[[scope]] 就是其中一个。 [[scope]] 指的就是我们所说的作用域,其中存储了执行期上下文的集合。 [[scope]] 中所存储的执行期上下文对象的集合呈链式连接,我们把这种链式连接叫做作用域链。查找变量就是从作用域链的顶端依次向下查找。 下面来看一个例子: function a() { function b() { var b = 234; console.log(b); } var a = 123; b(); console.log(b); } console.log(a); var glob = 100; a(); 函数 a

JavaScript作用域

匿名 (未验证) 提交于 2019-12-02 21:53:52
在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。 JavaScript 局部作用域 变量在函数内声明,变量为局部作用域。 局部变量:只能在函数内部访问。 因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。 局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁。 函数参数只在函数内起作用,是局部变量。 JavaScript 全局变量 变量在函数外定义,即为全局变量。 如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。 JavaScript 变量生命周期在它声明时初始化。局部变量在函数执行完毕后销毁。全局变量在页面关闭后销毁。 HTML 中的全局变量 在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象。 例题1 var num=10; fun(); function fun(){ console.log(num); var num = 20; } 输出结果为:undefined 解析后的代码为: var num; function fun(){ var num; console.log(num); num = 20; } num=10; fun(); 例题2 f1(); console.log(c); console

javaEE四大作用域(共享域)

匿名 (未验证) 提交于 2019-12-02 21:52:03
作用域------顾名思义,起作用的大小范围也!如果是你自己去学习一个知识点,你要达到哪些目标才算是对一个知识点称得上是懂得,理解,掌握呢?从扁神医的望闻问切,到数据库的增删改查,所有的事物开始也不外乎:是什么?有什么用?怎么用?为什么可以这么用?故而,我觉得咱们应该把握以下问题,带着这些问题去学习,发现自己的不足,才是学习的上策。 1)作用域的实际大小。(是什么?) 作用域的作用。(有什么用?) 3)怎么使用这些作用域。(怎么用?) 4)它这样使用实现的原理。(为什么可以这么用?) 下面开始逐一分析: (一)servletcontext域(application域) 1)作用域的实际大小。(是什么?) servletcontext域起作用的范围是:整个web应用程序。 数据产生之后,不仅等会还要用 ,还要给别人用,则请使用servletcontext。 它是四个域中范围最大的域。 作用域的作用。(有什么用?) 由于一个web应用中的所有servlet共享同一个servletcontext对象,所以多个servlet通过servletcontext对象实现了数据在不同servlet之间的共享。 3)怎么使用这些作用域。(怎么用?) a)可以通过编程的方式绑定,也可以作为web应用的全局变量被所有Servlet和JSPs访问 设置Context属性: ServletContext

JavaScript面向对象小抄集

泪湿孤枕 提交于 2019-12-02 20:18:00
前言 本文旨在记录JavaScript中面向对象的基础知识 搞明白JavaScript中的面向对象 一切都是对象 JavaScript中,除了基本类型外,其它类型都是对象类型 所谓对象就是若干属性的集合 数组、函数等都是对象,对象还是对象。像Number、Array、Function等这些函数,就是JavaScript默认的内建对象,可以直接使用 ,因此也常说JavaScript是基于对象的语言 对象里面的一切都是属性,方法也是属性,依然表示为键值对的形式 函数也可以有对象属性,其中JQuery中的$就是一个函数,$.trim()中的trim()就是函数$中的一个方法属性 JavaScript中的类型分为两种 值类型(非对象):undefined, number, string, boolean 引用类型(对象): 函数、数组、对象、null、new Number(10)、new String("1")、new Array(1) 等 判断对象方式: 使用 typeof : 当返回时"function"或者"object"字符串说明是引用类型对象 使用 instanceof :通过 obj instanceOf Object 返回true判断对象 所有对象都是继承自 Object对象 的 ,Object对象包含了一些通用的方法如 hasOwnProperty ,

JMeter学习(三)元件的作用域与执行顺序

耗尽温柔 提交于 2019-12-02 18:38:18
1.元件的作用域 JMeter中共有 8 类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(config elements 、timers 、post-processors、assertions、listeners、)需要与取样器(sampler)等元件交互。 配置元件(config elements )   元件会影响其作用范围内的所有元件。 前置处理程序(Per-processors)   元件在其作用范围内的每一个sampler元件之前执行。 定时器(timers )   元件对其作用范围内的每一个sampler 有效 后置处理程序(Post-processors)   元件在其作用范围内的每一个sampler元件之后执行。 断言(Assertions)   元件对其作用范围内的每一个sampler 元件执行后的结果执行校验。 监听器(Listeners)   元件收集其作用范围的每一个sampler元件的信息并呈现。 在jmeter中,元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是: 取样器(sampler)元件不和其它元件相互作用,因此不存在作用域的问题。 逻辑控制器(Logic Controller)元件只对其子节点中的取样器 和

js最佳实践

主宰稳场 提交于 2019-12-02 18:22:51
js 学习 1小时入门js https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript 了解如下3个js概念 https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c JavaScript 与其他语言的(如 Java)的重要区别是在 JavaScript 中语句块(blocks)是没有作用域的,只有函数有作用域。因此如果在一个复合语句中(如 if 控制结构中)使用 var 声明一个变量,那么它的作用域是整个函数(复合语句在函数中)。 但是从 ECMAScript Edition 6 开始将有所不同的, let 和 const 关键字允许你创建块作用域的变量。 so 尽可能用 let 和 const 一段优美的代码 ["233", "244", "255"].forEach((val, index, array) => { print(val, index, array); }) 来源: https://www.cnblogs.com/Draymonder/p/11757498.html