Leooonard / Notes

2 stars 0 forks source link

try,catch为什么在效率上表现不佳? #9

Open Leooonard opened 9 years ago

Leooonard commented 9 years ago

不创建执行上下文,而是在当前作用域下直接创建一个变量。和with语句一个意思。那么问题来了,什么是执行上下文?

执行上下文

变量提升大家都知道,那么为什么变量会提升呢?接下去看吧!
先明确几个概念,javascript中存在三种作用域。全局作用域,函数作用域,eval作用域。全局作用域只能是一个。函数作用域可以有多个,并且每次调用一个函数就将创建一个函数作用域(哪怕是反复调用同一个函数)。eval作用域我们稍后再说。(有一点需要注意,所有作用域都是内部能访问外部,相反则不能。

执行上下文的两个步骤

  1. 创建上下文环境。
    1. 创建作用域链
    2. 为函数预先创建变量。(注意以下三个步骤的执行顺序
      • 为函数参数创建变量,并赋值。
      • 为函数声明创建变量,并将变量的值指向函数。(如果遇见同名的,就更改其指向)
      • 为变量创建变量,并设置初始值undefined。(如果遇见同名的,无视路过)
    3. 确定this的值。
  2. 执行函数内容。
  //猜猜输出?
  void function(){
    console.log(foo)
    var foo = 1
    console.log(foo)
    function foo(){}
    console.log(foo)
  }()
  //关于这个问题,[查看此文](http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/),看AO\VO

执行栈如图

执行栈 相关文章

再来看看作用域链吧

。。。

回到try catch

这种动态创建作用域的特性让它性能表现变差。

使用window.onerror来代替try catch。