问几个很基础的函数问题

chen_2016_web 2017-08-22 08:31:22
很基础很基础的,所以求详细解析一下,谢谢。
第一个:

<script>
{
var a = 100;
let b = 100;
}
alert(a) //弹出100
alert(b) //错误
</script>

问题就是,在这里,这里的花括号{}的作用是什么?

第二个:

<script>
var a = [];
for(var i=0;i<10;i++){
var c = i;
a[i] = function(){
console.log(c)
}
}
a[5]();
</script>

上面的代码,输出9

<script>
var b = [];
function _loop() {
var d = j;
b[j] = function () {
console.log(d);
};
};
for (var j = 0; j < 10; j++) {
_loop();
}
b[5]();
</script>

这段代码输出5
请问这两段代码最明显的区别是什么?为什么输出的结果完全不同

第三个问题

<script>
var b = [];
for(var j=0;j<10;j++){
let d = j;
b[j] = function(){
console.log(d)
}
}
b[5]();
</script>

这是ES6的,又是关于let的,我是不太理解为何会输出5?
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_2016_web 2017-08-23
  • 打赏
  • 举报
回复
引用 4 楼 jslang 的回复:
第一个 {}是复合语句块,会产生块作用域。let 就是声明块作用域变量。而var声明的是函数作用域变量,在函数外用就是全局变量。 第二个 (1) c是全局变量。全局变量c只能存在一个,当循环结束时全局变量c当然是最后一次赋的值。(这个没有闭包) (2) 这个是闭包效应,d是函数作用域的局部变量。在一个函数内创建另一个函数就产生了闭包。闭包是指创建的函数会与创建函数所在的作用域绑定在一起。只要这个函数存在,创建函数所在的作用域和作用域中的变量就一直存在,不会被系统回收。可以让函数内始终能访问作用域中的变量。 第三个 这和第二个中的(2)一样,只是把函数作用域改成了块作用域
以前我就发觉你的JavaScript基础超级好的,我想请问,你是看什么书的?
chen_2016_web 2017-08-23
  • 打赏
  • 举报
回复
引用 4 楼 jslang 的回复:
第一个 {}是复合语句块,会产生块作用域。let 就是声明块作用域变量。而var声明的是函数作用域变量,在函数外用就是全局变量。 第二个 (1) c是全局变量。全局变量c只能存在一个,当循环结束时全局变量c当然是最后一次赋的值。(这个没有闭包) (2) 这个是闭包效应,d是函数作用域的局部变量。在一个函数内创建另一个函数就产生了闭包。闭包是指创建的函数会与创建函数所在的作用域绑定在一起。只要这个函数存在,创建函数所在的作用域和作用域中的变量就一直存在,不会被系统回收。可以让函数内始终能访问作用域中的变量。 第三个 这和第二个中的(2)一样,只是把函数作用域改成了块作用域
果然高手,一语惊醒梦中人!
天际的海浪 2017-08-23
  • 打赏
  • 举报
回复
第一个 {}是复合语句块,会产生块作用域。let 就是声明块作用域变量。而var声明的是函数作用域变量,在函数外用就是全局变量。 第二个 (1) c是全局变量。全局变量c只能存在一个,当循环结束时全局变量c当然是最后一次赋的值。(这个没有闭包) (2) 这个是闭包效应,d是函数作用域的局部变量。在一个函数内创建另一个函数就产生了闭包。闭包是指创建的函数会与创建函数所在的作用域绑定在一起。只要这个函数存在,创建函数所在的作用域和作用域中的变量就一直存在,不会被系统回收。可以让函数内始终能访问作用域中的变量。 第三个 这和第二个中的(2)一样,只是把函数作用域改成了块作用域
xjmds 2017-08-22
  • 打赏
  • 举报
回复
第二个,因为循环已经完成了,c就是等于9的了;a[5]()也是输出c,所以是9
chen_2016_web 2017-08-22
  • 打赏
  • 举报
回复
引用 1 楼 zzgzzg00 的回复:
第一个 let是块级作用域 {}形成块级作用域 所以块外无法访问 第二个闭包问题 第三个let const会形成自己的作用域 这个不知怎么表述了 可以自己看下阮一峰的 es6入门那本书
这回答太含糊了。第一和第三个问题,对我来说是新知识的问题,我可以接受你的回答。但是第二个问题,明显不是ES6的问题,单纯的回答闭包问题,等于没说明啊。
似梦飞花 2017-08-22
  • 打赏
  • 举报
回复
第一个 let是块级作用域 {}形成块级作用域 所以块外无法访问 第二个闭包问题 第三个let const会形成自己的作用域 这个不知怎么表述了 可以自己看下阮一峰的 es6入门那本书

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧