作用域和全部变量及局部变量:
全局作用:
其变量可以作用在全局中;但是如果函数内部有局部变量那么优选选取局部变量;
取值规则遵循如下三点:
第一:声明提升;(在这里涉及到关于浏览器执行读取代码的知识;首先,其运行原理是选预编译然后再执行!)
预编译:预编译这个过程就包括声明提升这个过程;其提升函数和声明的变量;
var a = 10;
function foo(){
console.log(a);//undefined
var a = 20;
}
foo(a);
其结果就是underfined;
因为在浏览器读取代码时,进行预编译,将函数foo()提升;将函数内部的声明提升;此时,就如同下面的代码:
var a = 10;
function foo(){
var a
console.log(a);
a = 20;
}
foo(a);
那么,当调取函数foo(a)时,虽然a=10这个值传到了实参,但是形参没有值;而在预编译时,下面执行了声明提升;于是定义了a这个变量但是没有赋值;所以执行结果是undefined;如果把上面的代码改为如下:
var a = 10;
function foo(){
console.log(a);//结果为10;
a = 20;
}
foo(a);
此时,输出的结果为 10;
如果改为如下:
var a = 10;
function foo(a){
console.log(a);//结果为10;
a = 20;
}
foo(a);
此时进行了实参传给形参;如果形参有了变量那么就相当于在函数内部定义了a;var a;
此时,形参的值是10;
如果将实参的a去掉;那么结果就不同了:
var a = 10;
function foo(a){
console.log(a);//结果为undefined;
a = 20;
}
foo();
就如同前面所说;给形参定义变量;就相当于在函数内部定义了变量a;
我们只需记住如下三个读取规则即可:
第一:声明提升;
第二:如果 函数的形参定义了变量;那么就相当于给函数内部定义了局部变量a;
第三:以上两点理解后,就是函数在执行时遵循就近原则;
当要 输出console.log(a);时那么向上开始寻找变量a的值;如果形参也没有变量;那么继续向上寻找;此时会寻找到全局变量的值;如下:
var a = 10;
function foo(){
console.log(a);//结果为10;
a = 20;
}
foo(a)
但是,如果在函数外边再输出a;那么此时会出现两个值;如下:
var a = 10;
function foo(){
console.log(a);//此结果为10;
a = 20;
}
foo(a);
console.log(a);//此结果为20;
此时,就又涉及到全局变量的定义:
第一:最外层函数和最外层函数外通过var来定义的变量
第二:在函数内部不通过var来定义的变量;
此时的20为全局变量;当里面的值输出后;其又覆盖了原值10;结果变为20;并且输出;但是:如果给函数的形参定义一下;如下:
var a = 10;
function foo(a){
console.log(a);//此结果为10;
a = 20;
}
foo(a);
console.log(a);//此结果为10;
此时20就变为了局部变量;不能覆盖原来的值10;
如果我们把实参的值a去掉;那么结果就又不同了:
var a = 10;
function foo(a){
console.log(a);//此结果为undefined;
a = 20;
}
foo();
console.log(a);//此结果为10;
其实和上面的一个例子一样的 含义;我们只需理解上面的三个规则即可;无论其如何变化;都可以得出正确的结论;