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);
上一篇 下一篇

猜你喜欢

热点阅读