变量作用域
变量只能在局部中使用,因此叫做局部变量
在任何地方都可以使用的变量叫做全局变量
优先局部变量。
局部变量特征
被定义在函数内部的变量,适用范围仅在函数内部,并且当前函数执行完成以后,这个变量会被销毁
下一次这个函数再执行时,会重新定义这个变量,并且变量在函数执行完成后不能被使用。
全局变量与局部变量同时存在的情况
1、外部的全局变量a想和内部的局部变量a相加
a+window.a ES6被禁止
2、如果当前函数内没有定义局部变量,则内部直接调用外部的全局变量
如果打印变量早于定义该局部变量之前,仍然遵循局部变量优先原则
例:var a=10;
function fn(){
console.log(a); //undefined
var a=4; //这句话的执行相当于定义与赋值是分开的。先定义后赋值。
console.log(a) //4 这两个a都是局部变量a
}
其内部结构其实相当于
function fn(){
var a;
console.log(a);
a=4;
console.log(a);
}
3、在函数中只要看到使用var定义的变量,这个变量就一定是局部变量,而且这个变量被优先调用。
4、没有使用var,当前变量是全局变量。在内部改变了全局变量,全局变量也会随之改变。
5、当在函数中设置了参数,那么就相当于,这个参数就是被var定义好的局部变量
6、重复定义不赋值,不起作用
例:var a=100;
function fn(a){
console.log(a);//6
var a;//因为参数本身就是局部变量,所以重新定义不赋值不起作用
console.log(a);//6
a=10;
console.log(a);//10
}
fn(6);
例:var a;
function a(a){
console.log(a);//6
var a;
console.log(a);//6
a=10;
console.log(a);//10
}
a(6);//可以执行,因为虽然是先定义了a函数,后重定义了a,但是重定义a并未赋值,所以不起作用,所以依然可以执行。如果是var=1; 赋值后便改变了a,执行函数a时会报错。
例:var a={
a:function(a){
var a
console.log(a);
}
}
a.a(5);//相当于执行了a对象的a属性方法,并将5当做参数传入到函数中。
7、不同函数里的局部变量之间的传递
function fn1(f){
var x=20;
f(x)
}
function fn2(x){
console.log(x);
}
fn1(fn2);