var函数

前端面试必会 | 一文读懂现代 JavaScript 中的变量提升 - let、const 和 va

删除回忆录丶 提交于 2019-12-19 08:05:35
本文翻译自 https://blog.bitsrc.io/hoisting-in-modern-javascript-let-const-and-var-b290405adfda ,作者 Sukhjinder Arora,内容有部分删改,标题有改动。 许多 JavaScript 程序员将提升解释为 JavaScript 将声明(变量和函数)移至其当前作用域(函数或全局)顶部的行为。好像它们实际上已经移到了代码的顶部,事实并非如此。例如: console.log(a); var a = 'Hello World!'; 他们会说,上面的代码将在提升后转换为以下代码: var a; console.log(a); a = 'Hello World!'; 尽管看起来是这样,因为代码也工作正常了,但是 JavaScript 引擎事实上并不是这么做的,你的代码还是在这里。 那么,提升是什么呢? 在编译阶段,即在代码执行前的几微秒内,将对其进行扫描以查找函数和变量声明。所有这些函数和变量声明都添加到内存中称为 词法环境 的 JavaScript 数据结构内部。这样,即使在源代码中实际声明它们之前也可以使用它们。 词法环境是什么? 词法环境是用来保存标识符和变量映射关系的地方。标识符是变量或者函数的名字,变量是对实际对象(包括函数对象和数组对象)或者原始值的引用。 简而言之,

前端开发之三、【第三篇: JavaScript基础】

六眼飞鱼酱① 提交于 2019-12-19 06:57:00
一、JavaScript 的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape(网景)接收Nombas的理念,( Brendan Eich) 在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript. 为了统一三家,ECMA( 欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范. J avaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理。 二、如何编写 1、JavaScript代码存在形式 <!-- 方式一 --> <script type"text/javascript

深入浅出JavaScript之闭包(Closure)

蹲街弑〆低调 提交于 2019-12-19 06:35:42
闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面写下我的学习笔记~ 闭包-无处不在 在前端编程中,使用闭包是非常常见的,我们经常有意无意,直接或间接用到了闭包。闭包可以使传递数据更加灵活(比如处理一些点击事件) !function() { var localData = "localData here"; document.addEventListener('click', //处理点击事件时用到了外部局部变量,比如这里的localData function(){ console.log(localData); }); }(); 又比如下面这个例子:(是不是很亲切~~) !function() { var localData = "localData here"; var url = "http://www.baidu.com/"; $.ajax({ url : url, success : function() { // do sth... console.log(localData); } }); }(); 再来看一个例子~~这种情况就是我们通常所说的闭包 function outer() { var localVal = 30; return

闭包(closure)

允我心安 提交于 2019-12-19 06:35:23
大牛的讲解, 点击   我们首先需要有作用域的概念, 点击    那么什么是闭包? 官方的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 广义上的闭包就是指一个变量在它自身作用域的被使用了,就叫发生了闭包。粗鲁地理解:闭包就是能够读取其它函数内部变量的函数。 在js中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单粗暴地理解成“定义在一个函数内部的函数”,即一个函数嵌套了另一个函数。 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性: 作用域链,垃圾(内存)回收机制,函数嵌套......   由于作用域的关系,我们在函数外部是无法直接访问到函数内部的变量的,但是函数内部可以把这个变量传给全局变量或者返回出来,这样外部作用域就可以访问函数内部作用域的变量了;   简单的说,闭包就是有权限访问另一个函数内部作用域的变量的函数; javascript具有自动垃圾回收机制,函数运行完之后,其内部的变量和数据会被销毁; 但是闭包就是在外部可以访问此函数内部作用域的变量,所以闭包的一个特点就是 script type ="text/javascript" > function outer(){ var a = 1 ; function inner(){ return a ++ ; }

javascript闭包

余生颓废 提交于 2019-12-19 06:34:38
官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点: 1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。 2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。 简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。 function closure(){ var str = " I'm a part variable. " ; return function (){ alert(str); } } var fObj = closure(); fObj();    在上面代码中, str 是定义在函数 closure 中局部变量,若 str 在 closure 函数调用完成以后不能再被访问,则在函数执行完成后 str 将被释放。但是由于函数 closure 返回了一个内部函数,且这个返回的函数引用了 str 变量,导致了 str 可能会在 closure 函数执行完成以后还会被引用,所以 str 所占用的资源不会被回收。这样 closure 就形成了一个闭包。 事实上

javascript闭包(Closure)初探

走远了吗. 提交于 2019-12-19 06:33:39
本文转自:http://www.cnblogs.com/jeffwongishandsome/archive/2009/05/17/1458405.html javascript闭包(Closure)初探 closure被翻译成“闭包”,感觉这东西被包装的太学术化。下面参考书本和网上资源简单探讨一下(理解不当之处务请留意)。 1、什么是 闭包 官方的回答:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 看了上面的定义,如果你不是高手,我坚信你会和我一样愤怒的质问:这tmd是人话吗? 要理解闭包,还是代码最有说服力啊,上代码: function funcTest() { var tmpNum=100; //私有变量 //在函数funcTest内定义另外的函数作为funcTest的方法函数 function innerFuncTest( { alert(tmpNum); //引用外层函数funcTest的临时变量tmpNum } return innerFuncTest; //返回内部函数 } //调用函数 var myFuncTest=funcTest(); myFuncTest();//弹出100 上面代码中,注释已经写的清清楚楚。现在我们可以这么理解“闭包”:在函数体内定义另外的函数作为目标对象的方法函数

JS中的闭包(closure)

感情迁移 提交于 2019-12-19 06:33:18
JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一.什么是闭包 JS中,在函数内部可以读取函数外部的变量 function outer(){ var localVal = 30; return localVal; } outer();//30 但,在函数外部自然无法读取函数内的局部变量 function outer(){ var localVal = 30; } alert(localVal);//error 这里有个需要注意的地方,函数内部声明变量的时候,一定要使用var命令。如果不用的话,实际上是声明了一个全局变量。 function outer(){ localVal = 30; return localVal; } outer(); alert(localVal);//30 以上的表述,是JS变量的作用域的知识,它包括全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 function outer(){ var localVal = 30; function inner(){ alert(localVal); } return inner; } var func =

详解js闭包

人盡茶涼 提交于 2019-12-19 06:32:33
转自:http://segmentfault.com/a/1190000000652891 闭包 ( closure )是 Javascript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 闭包是 javascript 语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。 一般函数执行完毕后,局部活动对象就被销毁,内存中仅仅保存全局作用域。但闭包的情况不同! 嵌套函数的闭包 function aaa() { var a = 1; return function(){ alert(a++) }; } var fun = aaa(); fun();// 1 执行后 a++,,然后a还在~ fun();// 2 fun = null;//a被回收!! 闭包 会使变量始终保存在内存中,如果不当使用会增大内存消耗。 javascript 的垃圾回收原理 (1)、在 javascript 中

JS编程规范

假装没事ソ 提交于 2019-12-19 04:12:48
  在第一家公司用C++时,公司有着严格的代码规范,甚至到了严苛的地步,现在回想起来,对它充满感激。一个好的习惯让你收益终身。   之后使用JS/TS却没有为自己定一套编程规范,所幸为时不晚,在这里参考airbnb公司代码规范。    -----该规范转载至阮一峰大大的ES入门   1.块级作用域   1)let 取代var   ES6 提出了两个新的声明变量的命令: let 和 const 。其中, let 完全可以取代 var ,因为两者语义相同,而且 let 没有副作用。    'use strict'; if (true) { let x = 'hello'; } for (let i = 0; i < 10; i++) { console.log(i); }      上面代码如果用 var 替代 let ,实际上就声明了两个全局变量,这显然不是本意。变量应该只在其声明的代码块内有效, var 命令做不到这一点。   var 命令存在变量提升效用, let 命令没有这个问题。 'use strict'; if (true) { console.log(x); // ReferenceError let x = 'hello'; }      上面代码如果使用 var 替代 let , console.log 那一行就不会报错,而是会输出 undefined

ES6学习笔记(二十一)编程风格

纵饮孤独 提交于 2019-12-19 02:33:14
本章探讨如何将 ES6 的新语法,运用到编码实践之中,与传统的 JavaScript 语法结合在一起,写出合理的、易于阅读和维护的代码。 1.块级作用域 (1)let 取代 var ES6 提出了两个新的声明变量的命令: let 和 const 。其中, let 完全可以取代 var ,因为两者语义相同,而且 let 没有副作用。 'use strict'; if (true) { let x = 'hello'; } for (let i = 0; i < 10; i++) { console.log(i); } 上面代码如果用 var 替代 let ,实际上就声明了两个全局变量,这显然不是本意。变量应该只在其声明的代码块内有效, var 命令做不到这一点。 var 命令存在变量提升效用, let 命令没有这个问题。 'use strict'; if (true) { console.log(x); // ReferenceError let x = 'hello'; } 上面代码如果使用 var 替代 let , console.log 那一行就不会报错,而是会输出 undefined , 因为变量声明提升到代码块的头部 。这违反了 变量先声明后使用的原则 。 所以,建议不再使用 var 命令,而是使用 let 命令取代。 (2)全局常量和线程安全 在 let 和 const