JS基础复习(四)四分钟带你彻底搞定全局变量和局部变量
一、写在开头
这个是因为最近期末考要考web,恰好有这个知识点,所以我自己总结了一下,希望可以帮助到大家。
二、发现问题
区分什么是局部变量,什么是全局变量,变量之间赋值后结果是什么,由于考虑到基础问题,我不会深入讲闭包作用域什么的,大家可以看看我下面的示例,自己思考。
三、解决问题
1.首先我们看看如何在函数内修改全局变量,很简单,只需要外面有定义一个全局变量,在函数内可以直接使用该变量(全局通用),该全局变量被修改的话在哪个地方使用都会是修改后的值,无关return。
// 在函数内修改全局变量,不需要return就能修改全局变量的值
var a1 = 10;
function test1 () {
a1 = 20;
console.log(a1); // 20
}
test1();
console.log(a1); // 20
// 同样是在函数内修改全局变量,这里return返回了修改后的全局变量,结果无异
var a2 = 10;
function test2 () {
a2 = 20;
console.log(a2); // 20
return a2;
}
test2();
console.log(a2); // 20
2.如果全局变量和局部变量重合呢?很简单在函数体内的话,局部变量会覆盖全局变量,而在函数外由于访问不到局部变量所以会访问到全局变量的值,因此不管函数内怎么修改,改变的始终是局部变量的值,不会影响全局变量。当然如果我们想访问到这个被修改的局部变量,可以通过return 局部变量,在外面拿到这个局部变量(闭包)。
// 全局变量和局部变量取同一个名字,则在函数体内局部变量覆盖全局变量,函数体外仍是全局变量
var a3 = 10;
function test3 () {
var a3 = 20;
console.log(a3); // 20
}
test3();
console.log(a3); // 10
// 依然是全局变量和局部变量取同一个名字,区别在于我们返回了局部变量,可以在外面使用这个局部变量(闭包)
var a4 = 10;
function test4 () {
var a4 = 20;
console.log(a4); // 20
return a4;
}
test4();
var result = test4(); // 20
console.log(result);
console.log(a4); // 10
3.然后说隐式声明全局变量,如果在声明不加var的话就会被看成是全局属性(姑且可以看成全局变量,只不过全局属性是可以被删除,全局变量不可以),既然是全局变量,不管是在函数内函数外都可以被访问到!当然了,如果隐式声明全局变量是写在函数内的,那么这个函数必须执行,否则会undefined!
// 这里我们隐式声明全局变量(其实正确的说是全局属性),在函数内调用全局变量改变了全局变量的值
function test5 () {
a5 = 10;
a5 = a5 + 10;
console.log(a5); // 20
}
test5();
console.log(a5); // 20
// 这里不仅仅是隐式声明全局变量,还接收了一个参数在函数内调用全局变量改变全局变量的值
function test6 (result) {
a6 = 10;
a6 = a6 + result;
console.log(a6); // 20
}
test6(10);
console.log(a6); // 20
4.这里看一个稍微有点奇怪的例子,这里由于多了var t = 3,在预解析的时候会出现变量提升,导致t变成了局部变量,同时变量提升并不会赋值所以是undefined,undefined加上10自然是NAN。
/*这里看似与test1差不多,但是由于有var t = 3; 导致变量提升,t不再是全局变量而是局部变量,而变量提升却不会赋值
所以t是undefined,再加上参数10则是NAN非数字了,提升后可以看成test7
*/
var t = 10;
function test(test){
t = t + test;
console.log(t); // NAN
var t = 3;
}
test(t);
console.log(t); // 10
var t = 10;
function test7(test){
var t = undefined;
t = t + test; // undefined+10
console.log(t); // NAN
t = 3; // 无效
}
test(t);
console.log(t); // 10
总结:
上面的例子比较好的说明了一些基本的情况,我这里再总结一下:
1.函数外声明的可认为是全局变量,函数内声明的是局部变量,一般无法被外界访问,除非闭包等。
2.变量声明时不加var是认为全局变量(实际上是全局属性),全局都可以访问。
3.全局变量与局部变量同名的话,两者的值不会互相影响。
好了,目前先到这,我是O5,希望能帮助到大家,共勉!