通过原型链解析js函数一些难以理解的的作用域问题

Posted iszhangk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过原型链解析js函数一些难以理解的的作用域问题相关的知识,希望对你有一定的参考价值。

基本原理

js函数在执行时,系统会创建一个隐式的属性scope,scope中存储的是函数的作用域链.

通过对这个scope的分析,就能解释javascript中许多难以理解的问题:

例1:
function demo() demo();

scope属性是在函数执行时创建,如果这个函数是一个全局函数,他的scope里会保存一个Global object和一个activation object.

global object保存的是全局的信息,而activition object保存的是函数内部的信息,比如函数中有哪些变量等

例2:
     function demo() function inner() demo();

如果这个函数是一个内部函数,他会继承父函的原型链,并在其顶端创建一个自己的activation.

当函数执行完毕,该函数的原型链被销毁.

为什么在函数外部不能调用函数的子函数

如例2所示:

当demo函数执行完毕后,该函数的原型链被销毁,在外部根本无从得知函数内部的信息.也就不能调用inner函数

为什么子函数可以使用父级函数的变量

因为子函数继承了父函数的原型链,他能够在原型链中通过父函数的activation object找到父函数定义的变量

 

以上是关于通过原型链解析js函数一些难以理解的的作用域问题的主要内容,如果未能解决你的问题,请参考以下文章

2. 原型链_作用域链_预处理_预解析

1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This

js原型链和继承的理解

js-高级(原型与原型链作用域与作用域链闭包)

关于JS的原型链和作用域链

原型模式故事链--JS变量作用域作用域链闭包