作用域

JavaScript 究竟是怎样执行的?

假装没事ソ 提交于 2019-12-25 22:23:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 摘要: 理解 JS 引擎运行原理。 作者:前端小智 原文: 搞懂 JavaScript 引擎运行原理 Fundebug 经授权转载,版权归原作者所有。 一些名词 JS 引擎 — 一个读取代码并运行的引擎,没有单一的“JS 引擎”;每个浏览器都有自己的引擎,如谷歌有 V。 作用域 — 可以从中访问变量的“区域”。 词法作用域 — 在词法阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。 块作用域 — 由花括号{}创建的范围 作用域链 — 函数可以上升到它的外部环境(词法上)来搜索一个变量,它可以一直向上查找,直到它到达全局作用域。 同步 — 一次执行一件事, “同步”引擎一次只执行一行,JavaScript 是同步的。 异步 — 同时做多个事,JS 通过 浏览器 API 模拟异步行为 事件循环(Event Loop) - 浏览器 API 完成函数调用的过程,将回调函数推送到回调队列(callback queue),然后当堆栈为空时,它将回调函数推送到调用堆栈。 堆栈 —一种数据结构,只能将元素推入并弹出顶部元素。 想想堆叠一个字形的塔楼; 你不能删除中间块,后进先出。 堆 — 变量存储在内存中。 调用堆栈 — 函数调用的队列

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

China☆狼群 提交于 2019-12-25 16:03:39
  作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 JavaScript作用域   任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。   1. 全局作用域(Global Scope)   在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:   (1)最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如: var authorName="山边小溪"; function doSomething(){ var blogName="梦想天空"; function innerSay(){ alert(blogName); } innerSay(); } alert(authorName); //山边小溪 alert(blogName); //脚本错误 doSomething(); //梦想天空 innerSay() //脚本错误   (2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如: function

07-03 名称空间与作用域

筅森魡賤 提交于 2019-12-25 15:47:27
[TOC] 一 名称空间 名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。 ​ 在程序执行期间最多会存在三种名称空间 插图:恶搞图19 1.1 内建名称空间 伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,比如内建函数名 >>> max <built-in function max> #built-in内建 插图:恶搞图20 1.2 全局名称空间 伴随python文件的开始执行/执行完毕而产生/回收,是第二个被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间中,如下名字 import sys #模块名sys x=1 #变量名x if x == 1: y=2 #变量名y def foo(x): #函数名foo y=1 def bar(): pass Class Bar: #类名Bar pass 插图:恶搞图21 1.3 局部名称空间 伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中 def foo(x): y=3 #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中 名称空间的加载顺序是:内置名称空间->全局名称空间->局部名称空间

EL表达式和JSTL

旧巷老猫 提交于 2019-12-25 04:54:36
EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段。所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。通常与 JSTL 标记一起作用,能用简单而又方便的符号来表示复杂的行为。 EL基本格式 EL表达式的格式:用美元符号($)定界,内容包括在花括号({})中; 例如: ${loginInfoBean.suser} 此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值; 例如:Hello {loginInfoBean.suser} ${loginInfoBean.spwd} EL语法组成-标识符 EL表达式由标识符、存取器、文字和运算符组成。 标识符用来标识存储在作用域中的数据对象。EL 有 11 个保留标识符,对应于 11个EL隐式对象。除了11隐式对象外,假定所有其它标识符都用来标识作用域的变量。 标识符 例: ${abc} 相当于<%=pageContext.findAttribute(“abc”)%> ${og_1} <%=pageContext.findAttribute(“og_1”)%> …等等;就是说{}内的标识符除了11个保留字之外都表示作用域中的数据对应的名. ${requestScope

深入浅出-作用域

南楼画角 提交于 2019-12-24 16:22:28
文章内容词语‘白话’; 声明 :定义标识符,起名字。 初始化 :赋值 声明但未初始化 :有名字能访问,但没给它赋值,所以它的值为undefined 变量提升 在函数作用域或全局作用域中通过关键字 var 声明的变量,无论实际是在哪里声明的,都会被当成在 当前作用域顶部 声明的变量,这就是我们常说的提升机制。 引用一个简单例子: function getValue ( condition ) { if ( condition ) { var value = "blue" ; return value ; } else { //此处可以访问变量value,其值为undefined return null ; } //此处可以访问变量value,其值为undefined } 无论如何,变量都会被创建,在预编译阶段,JavaScript引擎会把 getValue 函数修改成: function getValue ( condition ) { //声明 var value ; if ( condition ) { //初始化 value = "blue" ; return value ; } else { return null ; } } 变量 value 的声明和初始化被拆成两步执行, 声明被提升至函数顶部 ,而 初始化操作还在原处执行 ,所以在 else 字句中也可以被访问到

作用域链

纵然是瞬间 提交于 2019-12-24 05:07:02
作用域链   var a = 10;   function fn(){   var b = 10   console.log(b);   function fun1(){    console.log(c);    b += 6;    var c = 1;    function fun2(){    }    fun2();   }   fun1();   console.log(b); } fn(); 然后fun2(),fun1(),fun()依次出栈,活动对象依次消失。 来源: CSDN 作者: 沐。。 链接: https://blog.csdn.net/qq_44837990/article/details/103672737

带你彻底了解闭包以及其原理

拈花ヽ惹草 提交于 2019-12-24 05:02:27
闭包一直是许多初学者的难题,网上对闭包的讲解也是众说纷纭,但还是许多人不能明白。 下面我通过五个简单例子,让你明白闭包原理。 第一个例子 <script> var i = 0; document.onclick = addNumber; function addNumber(){ i++; document.title =i; }; </script> 第一个例子都能看懂,是个简简单单的实现 i 累加。无需多说,我们继续看第二个例子。 第二个例子 <script> document.onclick = addNumber; function addNumber(){ var i = 0; i++; document.title =i; }; </script> 第二个例子:我们会发现 i 这时候无法实现累加,一直显示是1。这是为什么? 原因是: 1、第一个例子的 i 定义在函数外面,它在一个叫做"全局作用域"的区域里面。"全局作用域"只会在浏览器窗口关闭或页面刷新的时候进行关闭。(我们跟第二个例子对比下就知道全局作用域)。 2、第二个例子的 i 定义在函数里面,它在一个叫做"局部作用域"的区域里面。(局部作用域是我自己命名的,方便理解)。"局部作用域"会在函数被调用的时候创建,而在函数运行结束的时候关闭(并且里面创建的变量跟函数也会被删掉–垃圾回收机制)。 3、通过上面的说法

Java,该学什么?

被刻印的时光 ゝ 提交于 2019-12-24 04:29:44
本人大学学的是生物技术专业,毕业后入坑Java。 最近有人问我是如何转行的,需要学一些什么。我在网上看到一篇帖子,觉得写得很全。如果是我来写,可能还写不了这么全的。在此分享给网友。 2019秋招几个月累积的知识点,东西太多,懒得重整理做索引,尽量用(*)和 加粗 标注出高频知识点, 都是面试问过的或笔试考过的 Java基础知识(*) https://blog.csdn.net/qq_16633405/article/details/79211002 Spring Boot 启动 流程(*) https://juejin.im/post/5b679fbc5188251aad213110#heading-0 Spring 一些面试题(*) https://www.ctolib.com/topics-35589.html 匿名内部类编译class(*) https://blog.csdn.net/lazyer_dog/article/details/50669473 为什么集合类没有实现Cloneable和Serializable接口? https://www.nowcoder.com/questionTerminal/2a4902f67d5b49b6b4c05f9d7e422caf 自动装箱原理 https://www.jianshu.com/p/0ce2279c5691

Scala 隐式(implicit)详解

对着背影说爱祢 提交于 2019-12-24 02:32:29
文章正文 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码。 1、Spark 中的隐式思考 隐式转换是Scala的一大特性, 如果对其不是很了解, 在阅读Spark代码时候就会很迷糊,有人这样问过我? RDD这个类没有reduceByKey,groupByKey等函数啊,并且RDD的子类也没有这些函数,但是好像PairRDDFunctions这个类里面好像有这些函数 为什么我可以在RDD调用这些函数呢? 答案就是Scala的隐式转换; 如果需要在RDD上调用这些函数,有两个前置条件需要满足: 首先rdd必须是RDD[(K, V)], 即pairRDD类型 需要在使用这些函数的前面Import org.apache.spark.SparkContext._;否则就会报函数不存在的错误; 参考SparkContext Object, 我们发现其中有上10个xxToXx类型的函数: implicit def intToIntWritable(i: Int) = new IntWritable(i) implicit def longToLongWritable(l: Long) = new LongWritable(l) implicit def