全局变量和局部变量的定义
全局变量的作用域是全局性的,即在整个Javascript程序中,全局变量作用处处都存在。定义在”script”块中,在”function”函数外。
(2)局部变量的作用域是局部性的,在函数内部或函数参数时定义,作用范围是从函数开始到结尾(注意此处说法)
(3)在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量(包括参数),那么该全局变量将不再起作用。
访问的规则
当我想获取一个变量的值的时候,我们管这个行为叫做访问
获取变量的规则:
首先,在自己的作用域内部查找,如果有,就直接拿来使用;
如果没有,就去上一级作用域查找,如果有,就拿来使用;
如果没有,就继续去上一级作用域查找,依次类推;
如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量 is not defined)
执行的阶段
当我想获取一个变量的值的时候,我们管这个行为叫做访问
获取变量的规则:
首先,在自己的作用域内部查找,如果有,就直接拿来使用;
如果没有,就去上一级作用域查找,如果有,就拿来使用;
如果没有,就继续去上一级作用域查找,依次类推;
如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量 is not defined)
函数提升和变量提升
1.函数提升的实例
2.变量提升的实例
3.注意 函数的表达式不会进行提升
原因: 函数表达式并不会被提升,只是简单地当做变量声明进行处理
4.预解析是分作用域的
定义: 声明提升并不是将所有的声明都提升到window对象下面,提升原则是提升到变量运行的环境(作用域)中去。
在es6之前没有块级作用域,只有全局作用域和函数作用域
if (true) {
var a = 20
}
console.log(20); //20
因此在{} 里面没有形参块级作用域
1.经典案例
var a = 12
function fn() {
console.log(a);
var a = 45
console.log(a);
}
fn();
思路分析: 在进行编译前,函数内部 的代码会进行预编译,
var a console.log (a) a=45 consoloe.log(a);
所以打印出来的结果是 underfined 和45
2. 函数传参的过程相当于在函数内部声明了一个局部变量
var a = 1;
function fn(a) {
var a
console.log(a); //undefined
a = 3;
}
fn();
console.log(a); //1
解析:函数内部如果有变量的话,则函数内部直接赋值的话,是给函数内部的局部变量进行赋值
3.如果函数内部没有声明局部变量
var a = 10;
function fn() {
a = 20
}
fn()
解析:函数内部没有变量,直接赋值的话,是在全局上进行赋值
4.
var y = 'global';
function test(x){
if(x){
var y ='local';
}
return y;
}
console.log(test(true));
输出:local
与C++所不同的是,JavaScript中的作用域是函数作用域,而不是块级作用域,
第一句话中的y的作用域是全局,而函数中y的作用域是test函数,上面的程序会返回test中的y,故输出local