什么是块级js 作用域域啊,js没有块级js 作用域域是啥意思

在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
"块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了"
在看阮一峰老师关于ES6的那本书里有上面这样一句话,不是很理解希望哪位大大可以帮我解答一下。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
ES6以前变量的作用域是函数范围,有时在函数内局部需要一些临时变量,因为没有块级作用域,所以就会将局部代码封装到IIEF中,这样达到了想要的效果又不引入多余的临时变量。而块作用域引入后,IIEF当然就不必要了!
function f(){
swap(var_a,var_b);
(function swap(a,b){
})(var_a,var_b);
如上面的代码,tmp被封装在IIFE中,就不会污染上层函数;而有块级作用域,就不用封装成IIEF,直接放到一个块级中就好。
function f(){
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
更简单的说法是,立即执行匿名函数的目的是建立一个块级作用域,那么现在已经有了真正的块级作用域,所以立即执行匿名函数就不需要了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
JavaScript有很多致命的缺陷,所以机智的开发者们想出了各种奇淫技巧来弥补它设计上的以及历史上遗留下来的坑.
比如JavaScript中没有namespace(命名空间),而且只有function(函数)代码的内部可以隔离作用域,自调用,立即执行函数则可以用来防止变量扩散到全局,这样就能很好的避免各种JavaScript库产生冲突。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
上面的回答很棒,我就不回答了
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
以前的立即执行函数很多场景是为了防止污染全局变量。
var foo = "a";
(function () {
var bar = foo + "b";
console.log(bar);// "ab"
console.log(bar);//undefined
比如说你有一些局部用一下的变量,变量在用完之后就释放内存,在子作用域里也就可以用短名字(什么id name之类的,而不是一长串selectedUserId selectedUserName)。现在有了块级作用域之后,就可以
let foo = "a";
//undefined
let bar = foo + "b";
console.log(bar);// "ab"
console.log(bar);//undefined
但不必要是一回事,并不是说IIFE就该被完全淘汰了。因为立即执行函数相对于块级作用域,多了一个返回值。一些偶尔的情况下用用挺好的,
let result1 = (() =& {
let bar = "some value";
//Block Scope
let result2;
let bar = "some value";
其实我个人还是比较喜欢第一种写法的。。当然这个见仁见智
该答案已被忽略,原因:
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:在其他类C的语言中,由花括号封闭的代码块都有自己的作用域(执行环境),因而支持根据条件来定义变量。但在JavaScript中没有类似的块级作用域,所以下面的代码在JS中并不会得到想象中的结果。
if (true){
var color="blue";
alert(color);
这里在一个if语句中定义了一个变量color,如果在其他类C语言中,则color会在if语句执行完毕后被销毁,但在JS中,if语句中的变量声明会将变量添加到当前的执行环境内(这里是全局环境)。在使用for语句时尤其要注意正如一差异,例如:
for(var i=0;i&10;i++){
doSomething(i);
对于有块级作用域的语言来说i,for语句初始化变量的表达式所定义的变量,只会存在于循环的环境之中。而对于JS来说,由for语句创建的变量i即使在for循环执行结束后,也依旧会存在于循环外部的执行环境中。
使用var声明的变量会自动被添加到最近的环境中,在函数内部,最接近的环境就是函数的局部环境;在with语句中,最接近的环境是函数环境。如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境中。
function add(a,b){
var sum=a+b;
return sum;
var result=add(20,30);
alert(sum);
以上代码中的函数add()定义了一个名为sum的局部变量,该变量包含加法操作的结果。虽然结果值从函数中返回了,但是变量sum在函数外部是访问不到的。如果省略这个例子中的var关键字,则当add()执行完毕后,sum也可以访问到:
function add(a,b){
return sum;
var result=add(20,30);
alert(sum);
此例中的sum在被初始化赋值时没有使用var关键字。于是当调用完add()后,添加到全局变量中的sum将继续存在。即使函数已经执行完毕,后面的代码依旧可以访问它。不建议这种做法,因为可能导致意外。在严格模式下,初始化未经声明的变量会导致错误。
本文已收录于以下专栏:
相关文章推荐
问题在其他类C语言中,由花括号封闭的代码块都有自己的作用域(ECMAScript叫做自己的执行环境),但是JavaScript没有块级作用域例如:
var col...
在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:function test(){
一、块级作用域JS没有块级作用域的概念,定义在块语句中的变量,实际上是在包含函数中而非语句中创建的,如下面例子,变量i和j创建之后即便离开了块语句,只要还在包含函数func中,就可以访问到这两个变量。...
JavaScript 没有块级作用域的概念,所以在块语句中定义的变量,实际上包含在函数中:function outputNumbers(count) {
for (var i = 0; i <...
简单的块级作用域:
javascript没有块级作用域的概念
function test(){
for(var i = 1 ; i ...
在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:
for(var i=0;i10;i++){
...
如前所述,JavaScript 没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含
函数中而非语句中创建的,来看下面的例子。
function outputNumbers(count)...
垃圾回收机制JavaScript有一种自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了。JavaScript垃圾回收的机制很简...
1.块级作用域(私有作用域),经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
(function(count){
for(var i=0;i0、1、2、3、4
模仿块级作用域:
JavaScript没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的。
看一个例子:
function outputNumbers(c...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)更好的工作机会
在100offer,提交一份个人资料,一周内即会有5-10家Top互联网公司主动向你发出邀请。100offer确保你的隐私万无一失,同时Consultant将为你全程提供专业服务。
最具价值web全栈课程
只做前端开发培训的好学校,专注于多方向全栈工程师培养。前端名师邵山欢亲自授课,课程涵盖HTML5、CSS3、Node.js、Angular、React诸多课程,免费视频广受学生好评。
跟牛人学前端
跟牛人学前端
妙味大前端自学宝典
妙味课堂2016年JavaScript课程大纲震撼升级、全栈来袭!
前端最新干货
前端最新干货
web在线直播课
潭州教育是中国较早的在线教育平台,教学内容涵盖网络营销,java,javascript,jquery,android,ios,mysql,围棋,刺绣,养殖,农业,手艺,网页设计,平面设计,影视后期,CAD建筑机械,网络营销,商战智慧,办公软件,三维设计,工业设计,淘宝摄影,英语,音乐,大学代理,Photoshop教程,
Max教程,Maya教程,CAD教程,会声会影教程,AI教程,淘宝开店,摄影教程,免费教程,素材下载等众多在线学习精品课程。经过10年的发展,潭州教育已经发展为中国规模较大的在线教育平台。
Node全栈工程师
课程涵盖:ECMAScript6、BootStrap响应式框架、LESS动态CSS、Node.js实战开发、Express快速开发框架、NoSql、Mongodb数据库、ejs、jade模板、WebSocket、主流前端框架React、Git协同开发、GitHub代码仓库、Ajax和前后端分离、微信公众号开发等。
WEB开发速查表
WEB开发速查表集合,专为开发文档所准备
您的位置: &#187; 分类:
&#187; 文章: ES6中块级作用域及变量声明let
您可能感兴趣的文章
近期最热文章
- 4,290 - 4,248 - 3,601 - 2,557 - 2,526 - 2,311
关注WEB前端开发公众号JavaScript匿名函数之模仿块级作用域
作者:tianxintian22
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了JavaScript匿名函数之模仿块级作用域的相关资料,需要的朋友可以参考下
函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。
匿名函数:就是没有函数名的函数。
函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式
第一种:这也是最常规的一种
function double(x){
return 2 *
&第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。
var double = new Function('x', 'return 2 *');
var double = function(x) { return 2* }
&注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量square。
JavaScript中是没有块级作用域概念的。也就是说,在块级语句中定义的变量,实际上是在包含函数中(外部函数)而非语句中创建的。
function outputNumber(count){
for(var i=0;i&1000;i++){
该函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在outputNumber()活动对象中的,因此在它定义开始,就可以在函数内部访问它。即使重新声明同一个变量,也不会改变它的值。
function outputNumber(count){
for(var i=0;i&1000;i++){
//重新声明变量
匿名函数可以用来模仿块级作用域并避免这个问题,用作块级作用域(也称私有作用域)的匿名函数的语法如下:
(function(){
//这是块级作用域
以上代码定义变调用了一个匿名函数,将函数声明包含在一个小括号里面,表示它是个函数表达式。紧跟其后的另一对小括号会立即调用这个函数。
无论什么时候,只要临时需要一些变量,就可以用私用作用域,例如:
function outputNumber(count){
(function(){
for(var i=0;i&1000;i++){
//导致一个错误
这样,我们在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
一般来说,我们应该尽量减少向全局作用域中添加变量和函数。
这种做法可以减少闭包占用内存的问题,因为没有指向匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域链。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 js es6 块级作用域 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信