作用域

for 循环中的 i 变量取值问题

微笑、不失礼 提交于 2019-12-18 10:02:20
1:如何点击某一个 li 的时候 alert 输出其index? <ul id="test">   <li>111</li>   <li>222</li>   <li>333</li>   <li>444</li> </ul> window.onload = function(){   var oLis = document.getElementById("test").getElementsByTagName("li");   for(var i = 0;i < oLis.length;i ++){     oLis[i].onclick = function(){       alert(i); //每次都是4     }   } } 解析:因为在for循环里面指定给oLis[i].onclick的事件处理程序,也就是onclick那个匿名函数是在for循环执行完成后(用户点击时)才被调用的。而调用时,需要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义,然后又到方法外部查找,此时有定义,但i的值是4(只有i大于4才会停止执行for循环),因此,就会取到该值——这正是闭包(匿名函数)要使用其外部作用域中变量的结果。而且,这也是由于匿名函数本身无法传递参数(故而无法维护自己的作用域)造成的.(比较啰嗦,可以看下面的解释) 其实是根据作用域链的原理

js作用域与变量,预解析

不问归期 提交于 2019-12-18 09:21:19
变量与作用域 基本类型的值不可以修改 引用类型可以 基本类型的值不可以设置属性与方法 引用类型可以 基本类型保存在栈内存中 引用类型在堆内存中 引用类型的地址保存在栈内存中 引用类型作比较时 只有他们的引用地址相同 他们才相等 基本类型的值 在复制的值被修改后 被复制的值不会改变 引用类型则会改变 因为指向同一地址 浅拷贝: 引用类型栈内存中使用同一地址 函数调用传参时 引用类型与基本类型都传的是值 js没有块级作用域 直接访问不存在的变量会报错 比如 console.log(person) 而如果 console.log(window.person) 则会返回 undefined instanceof 查看前面是否是后面的实例 [ ] instanceof Array 基本类型不能使用 预解析 变量提升 预解析首先读取 var 与function定义的变量与函数 将var定义的变量置为 undefined 将函数整个解析 不通过var声明的变量为全局变量 不会被预解析 如果变量与函数同名则忽略变量 同名变量与同名函数则保留后面的 在不同的script标签中的 先预解析先写的script标签 console.log不存在的变量或函数会报错;不存在的属性或方法,返回undefined 不要在if 与for之中定义函数 (有些浏览器无法进行预解析) 部分例题 输出 [4] [4, 44

我的前端知识梳理-ES5篇

半世苍凉 提交于 2019-12-18 02:15:01
本篇文章记录自己对es5知识点的理解 原文链接 1 JS创建对象的方式 es5有三种方式创建对象,分别是 // 第一种方式,字面量var o1 = {name: “o1”}var o2 = new Object({name: “o2”})// 第二种方式,通过构造函数var M = function(name){ this.name = name }var o3 = new M(“o3”)// 第三种方式,Object.createvar p = {name: “p”}var o4 = Object.create§ 对于对象,在这里也不做赘述,这里解释一下js中什么是标识符 /* 标识符 在JS中所有的可以由我们自主命名的都可以称为是标识符 例如:变量名、函数名、属性名都属于标识符 命名一个标识符时需要遵守如下的规则: 1.标识符中可以含有字母 、数字 、下划线_ 、$符号 2.标识符不能以数字开头 3.标识符不能是ES中的关键字或保留字 4.标识符一般都采用驼峰命名法 JS底层保存标识符时实际上是采用的Unicode编码, 所以理论上讲,所有的utf-8中含有的内容都可以作为标识符 */ 这里就看出js的缺陷了,如果对象中的属性不符合标识符规范怎么办,也就是我用.操作符无法获取属性的时候,比如说 var obj={ 1 : 1 } console.log(obj.1)

作用域链

断了今生、忘了曾经 提交于 2019-12-17 08:42:44
在 《JavaScript深入之执行上下文栈》 中讲到,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。 对于每个执行上下文,都有三个重要属性: 变量对象(Variable object,VO) 作用域链(Scope chain) this 今天重点讲讲作用域链。 作用域链 在 《JavaScript深入之变量对象》 中讲到,当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。 下面,让我们以一个函数的创建和激活两个时期来讲解作用域链是如何创建和变化的。 函数创建 在 《JavaScript深入之词法作用域和动态作用域》 中讲到,函数的作用域在函数定义的时候就决定了。 这是因为函数有一个内部属性 [[scope]],当函数创建的时候,就会保存所有父变量对象到其中,你可以理解 [[scope]] 就是所有父变量对象的层级链,但是注意:[[scope]] 并不代表完整的作用域链! 举个例子: function foo() { function bar() { ... } } 函数创建时,各自的[[scope]]为:

Web前端性能优化——编写高效的JavaScript

穿精又带淫゛_ 提交于 2019-12-17 05:23:48
前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代。自Gmail网页版邮件服务的问世开始,Web前端开发也开启了新的纪元。用户需求不断提高,各种新的技术层出不穷,前端工程师的地位也越来越重要。然而任何事物都是有两面性的,随着前端技术的发展,前端业务越来越繁重,这大大增加了JS代码量。因此,要提高Web的性能,我们不仅需要关注页面加载的时间,还要注重在页面上操作的响应速度。那么,接下来我们讨论几种能够提高JavaScript效率的方法。 一、从JavaScript的作用域谈起 当JavaScript代码执行时,JavaScript引擎会创建一个执行环境,又叫执行上下文。执行环境定义了变量或函数有权访问的其他数据,决定了它们的行为,每个执行环境都有一个与它关联的 变量对象, 环境中定义的所有函数、变量都保存在这个对象中。在页面加载的时候,JavaScript引擎会创建一个全局的执行环境,所有全局变量和函数都是作为window对象(浏览器中)的属性和方法创建的。在此之后,每执行一个函数,JavaScript引擎都会创建一个对应的执行环境,并将该环境放入环境栈中,所以当前正在执行的函数的执行环境是在环境栈的最顶部的,当函数执行完毕之后,其执行环境会弹出栈,并被销毁,保存在其中的变量和函数定义也会被销毁。 当代码在一个执行环境中执行时

js学习:函数

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-16 23:45:24
概述 函数的声明 JavaScript 有三种声明函数的方法 function 命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。 这叫做函数的声明(Function Declaration)。 function print(s) { console.log(s); } 函数表达式 除了用function命令声明函数,还可以采用变量赋值的写法。 var print = function(s) { console.log(s); }; 这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),因为赋值语句的等号右侧只能放表达式。 采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。 var print = function x(){ console.log(typeof x); }; // ReferenceError: x is not defined print() // function 上面代码在函数表达式中,加入了函数名x。这个x只在函数体内部可用,指代函数表达式本身,其他地方都不可用。这种写法的用处有两个,一是可以在函数体内部调用自身

学习Linux第17节课

拟墨画扇 提交于 2019-12-16 23:19:18
十四章 DHCP服务,十五章邮件服务 十四章难度不大,考试不考 作用域、超级作用域、排除范围、地址池、租约、预约。需要理解。 十五章 RHEL5、6中 服务叫做:sendmail RHEL7中叫做:postfix SMTP、POP3、IMAP4协议 来源: 51CTO 作者: 冉冉871456886 链接: https://blog.51cto.com/12865630/2459144

Spring容器中Bean的作用域

◇◆丶佛笑我妖孽 提交于 2019-12-16 14:51:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。 Spring支持如下5种作用域: singleton :单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype :原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request :对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效 session :对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效 globalsession :每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效    其中比较常用的是singleton和prototype两种作用域。 对于singleton作用域的Bean

Web前端-JavaScript--函数

半腔热情 提交于 2019-12-16 10:56:51
函数 如果有一段代码要反复执行 那么我们可以用大括号 包起来 起个名字 用来反复调用 这就是函数 所谓函数就是一段代码可以反复执行 只要调用函数 就可以反复执行重复的代码 函数定义的格式: function 函数名(参数(形参)){ 函数体代码(要被反复执行的代码) } 调用函数 函数名(实参); function show(){ console.log("请不要秀"); } show(); 因为函数运行过程中可能需要外部(函数调用者)传进来指定的数据 所以函数需要参数 格式: //形式参数 function 函数名(参数1,参数2,参数3,...参数n){ } 函数调用: 传入实际参数 要和形式参数 格式一样 函数名(实参1,实参2,实参3,...实参n) function plus(a){ //形参 console.log(a+10); } plus(55) //实参 plus(108) 形参和实参的数量不一致时的处理: 形参大于实参时(需要三个参数 我却传了2个 少传了): 多于的形参 值为undefined 形参小于实参(需要三个参数 我却传了4个 多传了): 多于的实参不予理会 形参和实参数量相等: 正常使用 function show(a,b,c) { console.log(a,b,c); } // show(5,6) show(5,6,7,8) 在js中没有函数重载

C++域作用符::

徘徊边缘 提交于 2019-12-16 08:50:32
"::“在C++中表示作用域,和所属关系。”::"是运算符中等级最高的,它分为三种,分别如下: 一、作用域符号: 作用域符号”::“的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分。 例如:A,B表示两个类,在A,B中都有成员member。 那么: 1、A::member就表示类A中的成员member。 2、B::member就表示类B中的成员member。 二、全局作用域符号: 全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分,例如: 三、作用域分解运算符: ::是C++里的作用域分解运算符,“比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如: 来源: CSDN 作者: hnujunjie 链接: https://blog.csdn.net/hnujunjie/article/details/103471966