JS中的全局变量和局部变量,和声明提升
在解释全局变量和局部变量之前,先说一个js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。
如何查找全局变量
-
最外层的函数和和最外层函数外面的变量都是全局变量。
因为函数是可以嵌套的,所以找全局变量时,要找最外层函数;而且函数本身也是一个变量,特殊变量,其名字就是变量名。
没有用 var声明的变量,为全局变量,即使位置在函数体内部。
- 所有Window对象的属性也是全局变量。
var v = "hello"; //函数体外的变量,全局变量
var a = 100
b = 10; //b也是全局变量
function test (){
v="11"; //没有用var声明的变量,全局变量
console.log(v);
var v = "world"; //函数体内部的变量,局部变量
}
test();
详细解释,各种情况
var v = "hello";
var a = 100
b = 10;
console.log(a);
function test() {
console.log(b);
var v = "world";
}
test();
-
var a = 100
b = 10;连续赋值,等同于 var a=100; b=10; b为没有var声明的全局变量 。元素中间用换行, 不然要报Uncaught SyntaxError: Unexpected identifier。
没有用var定义的全局变量,作用1、是为声明定义过的变量,重新赋值;不管是全局变量,还是局部变量。2、作为定义的变量。位置不管在全局或者局部,在局部时,一定要在输出(使用)前,定义好。(个人理解,如果读者有更好的了解或者觉得我的解释有误,可以留言)
- 函数内部的this指针指向,调用函数的调用者。
var v = "hello";
function test() {
var v = "world";
console.log(this.v);
}
test();
输出结果是hello。test()函数在此列子中为全局变量,所以调用它的为window,this.v等同于window.v。输出时,会去查找,属于window的变量。 var v = “hello”;为全局变量是属于window的。
知识点提升
变量和函数的声明提升:也叫预解析机制
var v = "hello";
function test (){
console.log(v);
var v = "world";
}
//上述代码等同于
var v = "hello";
function test (){
var v; //提升变量声明
console.log(v);
v = "world";
}
所以输出是undefined。
变量的提升:js执行过程中,遇到变量,会将变量声明提升到函数的第一行,只是提升声明,而不能赋值。
在代码中是禁止出现单独的元素变量的:var a=1;或者是a=1;或者是var a是可以的;但 绝对不能单独出现 a。前面两种是已经声明,并有确定的值。
var a;是定义了,但没有赋值,输出时会输出undefined。而单独出现的a,直接报test.html:18 Uncaught ReferenceError: a is not defined。这两者是不一样的,undefined是数据类型,而后者是活生生的错误。
<script>
var v = "hello";
function test() {
v = "world";
console.log(v);
var v = "gaega";
console.log(test1());
function test1() {
return 2;
}
}
test();
</script>
输出为:world,2
函数的声明提升:执行js代码时,预解析机制,会将代码中的所有函数按照包裹关系列出来,只是我们不知道而已。当调用时,再去查,是否定义了该函数。如果定义了,就执行函数;没有定义就报错。强调强调:预解析时只是知道有该函数,而不去执行该函数。所以在js中,调用语句可以写在函数定义之前。这种情况在其他语言中是没有的。
补充:
在js中是允许用相同的变量名的,这种情况在其他语言中是没有的。
<script>
var v = "hello";
function test() {
var v = "11";
console.log(v); //输出11
v = "33";
var v = "22";
console.log(v); //输出22
}
test();
</script>
变量赋值是从左到右的:
<script>
var a = 100;
function test() {
var a = 10;
a = 1;
console.log(a);
}
test();
</script>
上述代码的执行步骤:
- var a;
- a=100;
- test();
- 进入函数体内
- var a;
- a=10;
- 当执行a=1;之前a都为10;
- a=1;
- console.log(a);
在Google 中调试代码,观察代码执行顺序