function block(){ var a = 1; if(true){ var a = 2; } console.log(a) //2 } block() function block(){ let a = 1; if(true){ let a = 2; } console.log(a) //1 } block()上面的函数有两个代码块,都声明了变量a,运行后输出 1。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量a,最后输出的值才是 2 ES6中的块级作用域: 1、允许块级作用域任意嵌套,外层作用域无法读取内层作用域的变量
{{{{ {let i = 6;} console.log(i); // 报错 }}}}上面代码使用了一个五层的块级作用域,每一层都是一个单独的作用域。第四层作用域无法读取第五层作用域的内部变量。 2、内层作用域可以定义外层作用域的同名变量
{{{{ let i = 5; {let i = 10;} console.log(i) //5 }}}} {{{{ let i = 5; { let i = 10; console.log(i) //10 } }}}}3、不需要立即执行匿名函数 立即执行函数:
(function() { var a = 0; }());
块级作用域:
{ var a = 0; }块级作用域中的函数声明 运行环境:ES6浏览器。 可实现的行为: 1、允许在块级作用域内声明函数 2、函数声明类似于var, 即会提升到全局作用域或函数作用域的头部 3、函数声明还会提升到所有块级作用域的头部
function Func() { console.log('outside'); } (function() { var Func = undefined; if (false) { function Func() { console.log('inside'); } } Func(); })(); //报错考虑到环境导致的差异太大,应该避免在块级作用域中声明函数,如果需要,应该写成函数表达式的形式,而不是函数声明语句
let Func= function Func() { console.log('inside'); }; Func()ES6的块级作用域允许声明函数的规则只在使用大括号的情况下成立:
'use strict' if (true) { function Func1() {} // 不报错 } if (true) function Func2() {} // 报错
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。