{"action":"closed","issue":{"url":"https://api.github.com/repos/BigKongfuPanda/blog/issues/1","repository_url":"https://api.github.com/repos/BigKongfuPanda/blog","labels_url":"https://api.github.com/repos/BigKongfuPanda/blog/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/BigKongfuPanda/blog/issues/1/comments","events_url":"https://api.github.com/repos/BigKongfuPanda/blog/issues/1/events","html_url":"https://github.com/BigKongfuPanda/blog/issues/1","id":326701213,"number":1,"title":"ES6学习笔记 - 1. let & const","user":{"login":"BigKongfuPanda","id":16985024,"avatar_url":"https://avatars1.githubusercontent.com/u/16985024?v=4","gravatar_id":"","url":"https://api.github.com/users/BigKongfuPanda","html_url":"https://github.com/BigKongfuPanda","followers_url":"https://api.github.com/users/BigKongfuPanda/followers","following_url":"https://api.github.com/users/BigKongfuPanda/following{/other_user}","gists_url":"https://api.github.com/users/BigKongfuPanda/gists{/gist_id}","starred_url":"https://api.github.com/users/BigKongfuPanda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BigKongfuPanda/subscriptions","organizations_url":"https://api.github.com/users/BigKongfuPanda/orgs","repos_url":"https://api.github.com/users/BigKongfuPanda/repos","events_url":"https://api.github.com/users/BigKongfuPanda/events{/privacy}","received_events_url":"https://api.github.com/users/BigKongfuPanda/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2018-05-26T01:57:52Z","updated_at":"2018-05-26T02:01:08Z","closed_at":"2018-05-26T02:01:08Z","author_association":"OWNER","body":"// 1 基本用法\r\n// let 为块级作用域，经典用法为 for 循环\r\n\r\n/* 如果一下代码使用var，则最后输出的是10 */\r\nvar a = [];\r\nfor (var i =1; i < 10; i++) {\r\n    a[i] = function(){\r\n        console.log(i);\r\n    };\r\n}\r\na[6](); // 10\r\n\r\n/*如果使用let，声明的变量仅在块级作用域内有效，最后输出的是 6。*/\r\nvar a = [];\r\nfor (let i = 0; i < 10; i++) {\r\n    a[i] = function(){\r\n        console.log(i);\r\n    };\r\n}\r\na[6](); // 6\r\n/* 上面代码中，变量i是let声明的，当前的i只在本轮循环有效，所以每一次循环的i其实都是一个新的变量，所以最后输出的是6。你可能会问，如果每一轮循环的变量i都是重新声明的，那它怎么知道上一轮循环的值，从而计算出本轮循环的值？这是因为 JavaScript 引擎内部会记住上一轮循环的值，初始化本轮的变量i时，就在上一轮循环的基础上进行计算*/\r\n\r\n//另外，for循环还有一个特别之处，就是设置循环变量的那部分是一个父作用域，而循环体内部是一个单独的子作用域。\r\nfor(let i = 0; i < 3; i++){\r\n    let i = 'abc';\r\n    console.log(i);\r\n}\r\n// abc\r\n// abc \r\n// abc\r\n/* 上面代码正确运行，输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域，有各自单独的作用域。 */\r\n\r\n// 2. 不存在变量提升\r\n\r\n// var 的情况\r\nconsole.log(foo); //  输出 undefined\r\nvar foo = 2;\r\n\r\n// let 的情况\r\nconsole.log(bar); //  报错ReferenceError\r\nlet bar = 2;\r\n\r\n/**  上面代码中，变量foo用var命令声明，会发生变量提升，即脚本开始运行时，变量foo已经存在了，但是没有值，所以会输出undefined。变量bar用let命令声明，不会发生变量提升。这表示在声明它之前，变量bar是不存在的，这时如果用到它，就会抛出一个错误。 */\r\n\r\n// 3. 暂时性死区\r\n\r\nvar tmp = 123;\r\n\r\nif (true) {\r\n  tmp = 'abc'; // ReferenceError\r\n  let tmp;\r\n}\r\n/** 上面代码中，存在全局变量tmp，但是块级作用域内let又声明了一个局部变量tmp，导致后者绑定这个块级作用域，所以在let声明变量前，对tmp赋值会报错。\r\n *  ES6 明确规定，如果区块中存在let和const命令，这个区块对这些命令声明的变量，从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量，就会报错。\r\n * 总之，在代码块内，使用let命令声明变量之前，该变量都是不可用的。这在语法上，称为“暂时性死区”（temporal dead zone，简称 TDZ）    \r\n */\r\n\r\n //有些“死区”比较隐蔽，不太容易发现。\r\n function bar(x = y, y = 2) {\r\n    return [x, y];\r\n  }\r\n  \r\n  bar(); // 报错\r\n  /** 上面代码中，调用bar函数之所以报错（某些实现可能不报错），是因为参数x默认值等于另一个参数y，而此时y还没有声明，属于”死区“。如果y的默认值是x，就不会报错，因为此时x已经声明了 */"}}
{"actor":{"display_login":"BigKongfuPanda"}}