变量的作用域
我们都知道,js中声明了一个变量后,如果这个变量被使用了,那么就形成了一个变量的作用域,而作用域又分为局部作用域和全局作用域,这里讲的是作用域中变量的提升。
1:JavaScript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有的变量的声明都提升到当前作用域的最前面。如下例子所示:
我们可以看到在函数外部定义了v=hello,在输出的下面又重新定义了v=world,但是输出的却是undefined,是因为函数内部也定义了v,所以,输出的时候在函数找到了定义的v就不去函数外部找了,但是函数内部虽然定义了并且赋值了,但是作用域中的变量,将变量的声明提升到了函数的最顶端,但是定义的变量的值却不提生,所以输出的就是undefined。
再如下所示:
// 变量提升:在各自的作用域中所声明的变量都会提升到作用域最顶端
// 提升;【声明提升】,赋值不提升 ---->已经定义为赋值的变量
var v = "hello";
function fun() {
console.log(v);// 使用变量v 当前处于 已定义 为赋值
var v = "world";
return 23
};
fun();//undefined
// console.log(a) // a is not define
// 变量未定义: xxx is not define
// undefined 表示变量已经定义 在执行当前【使用变量】时,处于【未赋值】状态
console.log(v)
// 因为变量a已经声明,所以变量会提升到当前作用域顶部,
// 又因为;当前使用变量a 没有赋值
// 所以输出 undefine
console.log(a)
console.log(b)
var a ;
var b =123;
var c = fun()
console.log(c)