在ES5语法规范中,在执行代码之前,会进行变量提升
,同时还会形成作用域,因此就出现了全局作用域
和私有作用域
,举个栗子吧!
var a = 12,
b = 13,
c = 14;
function fn(a) {
var b;
console.log(a, b, c);
var b = c = a = 20;
console.log(a, b, c);
}
fn(a);
console.log(a, b, c);
代码不长,要解题需要用到”变量提升+全局/私有变量“等知识点。具体解释写在代码中吧!
/*
* 变量提升:
* var a; var b; var c;
* fn = xxx...
*/
var a = 12,
b = 13,
c = 14;
function fn(a) {
/*
* ①、形参赋值
* a = 12 【私有变量】
* 变量提升
* var b; 【私有变量】
*
*/
console.log(a, b, c);//=>12 undefined 14(C是全局的)
var b = c = a = 20;
/*
var b=20;
c=20; =>把全局的C修改为20
a=20;
*/
console.log(a, b, c);//=>20*3
}
fn(a);//=>把FN执行(小括号中是实参:值) =>执行FN把全局变量A的值12当做实参传递给函数的形参 =>fn(12)
console.log(a, b, c);//=>12 13 20
在私有作用域中,只有以下两种情况是私有变量:
- A:声明过的变量(带VAR/FUNCTION)
- B:形参也是私有变量
剩下的都不是私有的变量
,都需要基于作用域链的机制向上查找