Javascript之作用域
JavaScript-作用域
var 除了函数的{}之外,其他地方都不会认为是子作用域.
let 在任意{ }里面,如果用的是let关键词定义的变量,那么这个{}视为一个子作用域,在for的()里面,用let定义变量,视为子作用域.
Var的解析
- 定义 -- 找出变量 (找当前作用域所有的 var、function 两个关键词定义出来的变量)
- 执行 -- 从上到下,执行代码 (取值,就近原则,当前作用域有值就取当前,没有就取父级)
举个例子:
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)
- let :同作用域下,let 不允许重名
- var 与 function 可以重名
注:
- var var重名,就当成同一个变量来看
- function function重名,以最后面的为准
- var function重名,(1.定义)过程中,以function为准
- 执行后重新赋值,以赋值的值为准
举个例子:
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(); */