2021-03-02
2021-03-03 本文已影响0人
转移到CSDN名字丹丹的小跟班
js
1. 静态作用域
因为 JavaScript 采用的是词法静态作用域,函数的作用域在函数定义的时候就决定了。
var n = 10
function f1() {
var n = 20
f2()
}
function f2() {
console.log(n)
}
f2() // 10
var n = 10;
function f1() {
var n = 20;
function f2() {
console.log(n);
}
f2();
}
f1(); //20
JS的解析与执行过程—全局预处理阶段之命名冲突的处理策略
在扫描函数声明与变量声明的时候,是先扫描函数声明(function fn()),后扫描变量声明(var a)的;
- 处理函数声明有冲突,会覆盖;
- 处理变量声明有冲突,会忽略;
上面代码中,由于先扫描函数声明,所以LexicalEnviroment对象中先存在了 f 指向函数的引用,然后扫描到变量的时候发现变量名冲突(虽然是忽略这个变量重复声明,但变量的赋值不会忽略),忽略这个变量,所以第一次打印函数字符串。
console.log(f); //f() {}
function f() {}
var f = 5
console.log(f); //5
待解
{
a = 99;
function a() {}
a = 30;
}
console.log(a);