域解析
2020-02-21 本文已影响0人
sugar_sugar_ya
函数变量及作用域
隐式全局变量:变量没有声明,直接赋值,执行到时,浏览器才会偷偷把变量提升为隐式全局变量
全局作用域:在函数声明之外的作用域
预解析:
- 所有的变量声明,都会提升到最顶部,但不会提升赋值
- 所有的函数声明,都会提升到最顶部,但不会提升函数的调用
- 如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略
- 如果同时有多个同名的函数,后面的函数将会覆盖前面的函数
- 如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量
词法分析3步骤:
- 先分析函数形参(默认值为undefined),再分析形参赋值(没有形参的直接忽略此步骤)
- 分析函数体中所有的变量声明:
2.1 如果变量名与形参名相同时,直接忽略var;
2.2 如果变量名与形参名不同时,就相当于声明了一个变量,如var foo,值为undefined; - 分析函数体中所有的函数声明,
3.1 如果函数名与变量名相同,函数将作为变量的值;
3.2 如果函数名与变量名不相同,相当于var 函数名 = function 函数名 () {};
函数执行过程分为2步:
- 词法分析过程;
- 执行过程
栗子1:
function a(b) {
console.log(b);
function b() {
console.log(b);
}
b();
b=1
}
a(1);
栗子2:
function t3(greet) {
console.log(greet); //?
var greet = 'hello';
console.log(greet); //?
function greet() {
};
console.log(greet); //?
}
t3(null);
栗子3:
function test(a, b) {
console.log(a);
console.log(b);
var b = 234;
console.log(b);
a = 123;
console.log(a);
function a() {
}
var a;
b = 234;
var b = function () {
}
console.log(a);
console.log(b);
}
test(1);
知识点补充:
arguments是一个对应于传递给函数的参数的类数组对象。(可以获取实参)
function fn(a,b) {
console.log(arguments);
console.log(arguments[0]);
console.log(arguments[0] = 4);
console.log(a);
}
fn(1,2,3);
栗子4:
a = 100;
function demo(e) {
function e() {
}
arguments[0] = 2;
console.log(e);//?
if (a) {
var b = 123;
}
a = 10;
var a;
console.log(b); //?
f = 123;
console.log(a); //?
}
var a;
demo(1);
console.log(a); //?
console.log(f); //?
具名函数中的变量不能用来调用函数
var a = function b() {
console.log(123);
}
a();//123
b();报错