#前言
本文主要阐述一些JavaScript行为的深层原因。很多东西都是主观臆测结合编程经验推测出来的。 如有谬误请包涵,也可以联系作者(qq:504451056,email:504451056@qq.com)
javascript的行为
- scope
- 函数中的this
- 变量提升
- 作用域链本质
- 函数调用栈问题
- 函数柯里化本质
scope函数对象
所谓的scope就是引擎在执行函数定义(包括函数声明,定义函数表达式,与匿名函数声明)时,向内存堆申请内存空间并把函数的上下文写入改空间。以后函数将在该上下文执行。该上下文包涵2部分:
- (1) 声明部分
- (2) 执行部分
声明部分:
包涵: 声明的内部函数,变量,参数,维护一个地址池,地址池里面的地址指向内部函数,变量和参数。 本质:就是函数对象的属性 执行部分: 包涵: 除了声明以外的计算过程都包含在这个里面 本质:就是函数对象的一个方法 参数部分 在调动函数部分时动态赋值引擎发现下面这个函数声明
function funOut(arg,arg1){ var prop = 0; function funInner(){ console.log(porp1); } var props = 1; funInner(); console.log(arg,arg1);}复制代码
总体经历了以下几步
1创建scope对象并创建地址池 var funOut = { arg:null, arg1:null, prop:null, prop1:null, funInner:null, _props_:window, init:function(supperContext,arg,arg1){ funOut. _props_ = supperContext||windows funOut.arg = arg, funOut.arg1=arg1, funInner = function(funOut,arg,arg1){ funOut.arg = arg, funOut.arg1=arg1 }, }, applay:function(){ prop = 0; porp1 = 1; funInner(); console.log(arg,arg1); }, this:windows//因为funOut对用户不可见,this只是一个特殊的处理而已 } 注:上面这个结构是引擎通过引擎内置语言实现的,对用户不可见,有可能是C也有可能是汇编这个不是重点复制代码
函数中的this
正如scope所示,scope对用户不可见的所以this不可能提供给用户。所以function 中的this是一个伪this,直接为了保持和window的联系直接提供了windowd的地址。 同事修改function中的this有几种方法如下:
- bind()
- apply()
- .
- call()
- =>
变量提升
其实到现在变量提升原因已经很明显了,函数对象不是js对象遵循其他编程语言规范
作用域链本质
所谓的作用域链是对scope对象链的代称,该链跟js原型链有曲艺同工之妙,只要有末端节点就可以向上冒泡寻访所有节点这是嵌套函数本质
函数调用栈问题
通过前面知道 函数对象在堆中,那么栈中放的必然是地址信息。注意时间循环对函数结束的影响
function cir(){ cir()}function cor(){ setTimeOut(function(){ cor },2000); return true;//cor函数执行到此处已经完结,弹出栈所以cor的深度是固定的}注意两则的本质区别 复制代码
函数柯里化本质
函数柯里化本质就是返回 作用域的末端,可以理解为一条作用域链的末端,好处在于可以创建支链,切可以方便移动。
以上东西很多为个人臆测。如果有指导更正感激不尽!