- A+
所属分类:Web前端
作用域有:全局作用域和局部作用域
var 除了函数的{}之外,其他地方都不会认为是子作用域
let 在任意{ }里面,如果用的是let关键词定义的变量,那么这个{}视为一个子作用域,在for的()里面,用let定义变量,视为子作用域.
Var的解析
1. 定义 -- 找出变量 (找当前作用域所有的 var、function 两个关键词定义出来的变量)
2. 执行 -- 从上到下,执行代码 (取值,就近原则,当前作用域有值就取当前,没有就取父级)
举例说明如下:
var x = 5; a(); function a(){ alert(x); var x = 10; } alert(x); /* * 1. 定义 * 15:var x; * 17-20: function a(){...} * * 2. 执行 * 15: x=5; * 16: a(); ==子作用域==> 1. 定义 * 19: var x; * 2. 执行 * 18: alert(x); //undefined * 19: x = 10;(改变的是自己作用域的x) * 21: alert(x); //5 * * * */
重名注意事项(var,function,let)
1. let :同作用域下,let 不允许重名
2. var 与 function 可以重名
注 :1.var var重名,就当成同一个变量来看
2. function function重名,以最后面的对准.
3. var function重名,(1.定义)过程中,以function为准
4. 执行后重新赋值,以赋值的值为准
举例说明如下:
alert(a); var a = 10; alert(a); function a(){alert(20)} alert(a); var a = 30; alert(a); function a(){alert(40)} alert(a); /* * 1. 定义 * 22: function a(){alert(40)} * * 2. 执行 * 15: alert(a); // 打印函数体function a(){alert(40)} * 16: a = 10; * 17: alert(a); // 10 * 19: alert(a); // 10 * 20: a = 30; * 21: alert(a); // 30 * 23: alert(a); // 30 * * */
闭包
含义: 函数里面嵌套一个函数,内部函数使用了外部函数的参数/变量,形成闭包.
在一个作用域中包含一个作用域,子作用域使用了父作用域的 参数/变量 ,形成闭包.
举例说明如下:
(function(){ let a = 10; document.onclick = function(){ a ++; console.log(a); }; })(); /* function a(){ let x = 20; return function() { x ++; console.log(x); } } let b = a(); */ /* b(); b(); b(); b(); b(); let c = a(); c(); c(); c(); c(); c(); */