ecma6块级作用域

转载自:http://blog.sina.com.cn/s/blog_77f241790102vqyf.html

在很多语言中都有块级作用域,但JS没有,它使用var 声明变量,以function来划分作用域,大括号{}却限定不了var的作用域。用var声明的变量具有变量提升(declaration hoisting)的效果

ES6里增加了let,可以在{},if ,for里声明。用法同var ,但作用域限定在块级,let声明的变量不存在变量提升。

一、let命令

示例1:{}块

{

let a =10;

var b=1;

}

console.log(a) // ModuleEvaluationError: a is ont defined

console.log(b) //1

上面的代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用了这两个变量,结果let声明报错,var 声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

示例2:if

function getVal(boo){

if(boo){

let val = ‘red‘;

return val

}else{

// 这里访问不到val

return null;

}

// 这里也访问不到val

}

示例3:块级作用域for

var a = [];

for (var i = 0; i < 10; i++) {

a[i] = function () {

console.log(i);

};

}

a[6](); //10

// 上面的代码用var 最后输出是10

var a = [];

for (let i = 0; i < 10; i++) {

a[i] = function () {

console.log(i);

};

}

a[6](); //6

// 上面代码用let,声明的变量公在块级作用域内有效,最后输出6

 

示例四:变量提升(先使用后声明)

function func(){

// val先使用后声明,不报错

alert(val);

var val;

}

变量val先使用后声明,输出undefined ,也不报错

这也意味着typeof不再是一个百分之百的安全操作

ES6规定,如果代码块中存有let,这个区块一开始就形成了封闭作用域。凡是在声明之前就使用,就会报错。

即在代码块内,在let声明之前使用变量都是不可用的。语法上有个术语叫“暂时性死区”,简称TDZ。

当然TDZ并没有出现在ES规范里,它只是用来形象的描述。

let 注意事项

1、不能重复声明

// var 和 let重复声明

var name = "linyufei";

let name = "mvp";

// 两个let重复声明

let age = 24;

let age = 30;

执行时报语法错误 (注: 在firefox中调试,不存在报错现象)

2、有了let后,匿名函数自执行就可以去掉了

// 匿名函数写法

(functoin(){

var jQuery = function(){};

window.$ = jQuery;

})()

// 块级作用或写法

{

let jQuery = function (){};

window.$ = jQuery;

}

二、const命令

const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。

const PI = 3.1415;

PI = 4;

// 提示PI is read-only;

时间: 2024-11-16 02:22:38

ecma6块级作用域的相关文章

ES6之块级作用域

一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一术语--“变量提升(hoisting)”. 如下: function func(){ console.log(test); var test = 1; }; func(); 在node环境执行上述代码,结果为: 之所以为’undefined’,原因就在于‘变量提升’,在进入func函数时,将所有通过

模仿块级作用域

在JavaScript中没有块级作用域的概念.这就意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. <script> for(var i=0;i<5;i++) { } alert(i); </script> 就上面这个例子中,可以弹出i是5,因为for语句事实上是包含在window.onload= function(){}这个函数中,alert也在这个函数中. 而在java.c++中i只会在for循环的语句块中定义,循环一但结束,变量i就会被销毁.而在Jav

垃圾收集、块级作用域

javascript是一门具有自动垃圾收集机制的编程语言,开发人员不必前内存分配的回收的问题. 离开作用域的值将被自动标记为可以回收,因此将来在垃圾收集期间被删除.标记清除是目前主流的垃圾回收算法,这种算法思想是给当前的值加上标记,然后回收其内存. javascript里没有块级作用域的概念,和c,java等高级语言不同所以在使用if,for格外小心 for(var i=0;i<3;i++) { alert(i); } alert(i);//打印出4

关于JavaScript中没有块级作用域的理解

引用<JavaScript权威指南>(第六版)中的举例 代码段1: var scope="global"; function f(){ console.log(scope); scope="local" console.log(scope); } f(); 会输出什么? 答案:undefined  global 代码段2: var scope="global"; function f(){ var scope; console.log

关于Javascript没有块级作用域和变量声明提升

Javascript是没有块级作用域的,在语句块中声明的变量将成为语句块所在代码片段的局部变量.例如: 1 if(true){ 2 var x=3; 3 } 4 console.log(x); 结果输出3. 再如: 1 var x=5; 2 3 function a(){ 4 if(!x){ 5 var x=10; 6 } 7 console.log(x); 8 } 9 a(); 结果是10.因为变量声明的提升,原理是这样的,举个例子: 1 if(a==undefined){ 2 alert("

匿名函数模仿块级作用域

问题 [无块级作用域]JavaScript中没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. function outputNumbers(count){ for(var i = 0; i < count; i++){ alert(i); } console.log(i); } outputNumbers(2);//弹出0,1输出2 //变量i是定义在outputNumbers()的活动对象中的,因此从它有定义开始,就可以在函数内部随时访问它. 函数中的

block、块级作用域

block:语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 包含在{ }里面 通常在流程控制语句 (如 if, for, while)中使用 块级作用域:通过var声明的变量没有块级作用域. 在语句块(block)里声明的变量作用域是其所在的函数或者 script 标签内, 你可以在语句块外面访问到它. 换句话说, 语句块不会生成一个新的作用域. 尽管单独的语句块是合法的语句, 但在JavaScript中你不会想使用单独的语句块,因为它们不像你想象的C或Java中的语句块那样处理

JavaScript的作用;JS常见的三种对话框;==和===的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区:没有块级作用域

JS:客户端(浏览器)脚本语言 弱类型 基于原型 事件驱动 不需要编译(直接运行) JS的作用:表单验证,减轻服务端的压力 添加页面动画效果  动态更改页面内容  Ajax网络请求 (一)常见的对话框 alert()对话框:该方法是window对象的方法,在浏览器中弹出一个对话框(该方法没有返回值)  prompt()对话框:2个参数,一个是浏览器提示信息,第二个是默认的输入框的值,返回值就是输入框的信息  confirm()对话框:在浏览器弹出一个对话框,用户只能选择正确或者取消,返回值对应为

js没有块级作用域

今天看一篇介绍ECMAscript6的博文时,看到let命令的时候突然有点蒙逼....... let命令:let用于变量声明,与var用法类似,但是let是一个局部变量,只在声明的代码块中有效. { let a = 10; var b = 20; } a // not defined b // 20 看到这我觉得这个块级作用域是函数作用域,但是块级作用域和函数作用域是不一样的,比如: function demo(){ var a=1; } console.log(a); a//not defin