定义全局变量的两种方式:
①.带var定义的变量:会将声明提升到全局作用域的顶端。
console.log(a);//undefined
var a = ‘哈哈’;
console.log(a);//哈哈
//解析:在控制台打印第一个a输出undefined是因为a在下面用var定义了。
声明提升情况如下:
var a;
console.log(a);
a = ‘哈哈’;
console.log(a);
但是第一个console.log(a);怎么知道下面声明a了呢?
js的预解析: js会优先去找在全局中用var声明的变量,将声明提升到全局作用域的顶端。
②.不带var定义的变量:必须是声明+赋值,变量的声明不会提升,否则会报错。
a = 5;
console.log(a);//5
//如果把a写在下面,直接打印a会报错
console.log(a);//报错
a = 5;
在函数中用var定义的变量是函数中的局部(私有)变量,从外界是无法访问的。
在函数中用var定义的变量,声明会提升到函数作用域的顶端。
在函数中没有用var定义的变量,一定是函数上一层作用域的。
函数中定义了形参a,如果在函数调用时不传参数,相当于在函数内部定义了a但是未赋值。
在函数调用时传实参,但写函数时没有写形参,实参时传不过去的。
var a = 5;
function fn() {
var a = '哈哈';
console.log(a);//哈哈 函数fn内的a
}
fn();
console.log(a);//5 外部的a
var a = 5;
function fn() {
a = '哈哈';
console.log(a);//哈哈
}
fn();
console.log(a);//哈哈
/*调用函数fn(); 由于在函数内部没有定义a,a = '哈哈';是外部的a,
把var a = 5;中的a覆盖了,函数中打印的a是外部被覆盖掉的a,
函数外打印的a还是外部被覆盖掉的a*/
function fn() {
console.log(a);//undefined
var a = '哈哈';
console.log(a);//哈哈
}
fn();
/*调用函数fn(); 函数中打印的第一个a是函数内部的,变量提升到函数作用域顶端的a,
声明了但未赋值,函数中打印的第二个a是赋值为哈哈后的a*/
var a = 5;
function fn(a) {
a = '哈哈';
console.log(a);//哈哈
}
fn(0);
console.log(a);//5
/*调用函数fn(0); 把实参0传递给形参a,此时相当于在函数内部声明a并赋值为0,
var a = 0,函数内部的a = '哈哈';会把a=0覆盖掉,所以内部打印的是哈哈,
外部打印的还是外部的a,是5*/
var a = 5;
function fn() {
console.log(a);//5
a = '哈哈';
}
fn('嘿嘿');
console.log(a);//哈哈
/*调用函数fn('嘿嘿'); 实参嘿嘿传不到函数中,因为函数中没有形参,函数中打印的a
依然是外部的a是5,接着a = '哈哈';把函数外部的a=5覆盖了,所以函数外部打印的a是
哈哈*/
var a = 5;
function fn(a) {
console.log(a);//5
a = '哈哈';
}
fn(a);
console.log(a);//5
/*调用函数fn(a); 由于外部声明赋值了var a = 5;,所以把实参5传给了函数的形参a,
相当于在函数内部声明并赋值了var a = 5;然后在函数内部打印a
是5,然后函数内部的a = '哈哈';把函数内部的var a = 5;中的a覆盖了。
在函数外部打印的a依然是外部的a,所以是5*/