博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过 “函数对象”看javascript函数
阅读量:6839 次
发布时间:2019-06-26

本文共 1915 字,大约阅读时间需要 6 分钟。

#前言

本文主要阐述一些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的深度是固定的}注意两则的本质区别 复制代码

函数柯里化本质

函数柯里化本质就是返回 作用域的末端,可以理解为一条作用域链的末端,好处在于可以创建支链,切可以方便移动。

以上东西很多为个人臆测。如果有指导更正感激不尽!

转载于:https://juejin.im/post/5b42b607f265da0f9155f009

你可能感兴趣的文章
8 个你可能不知道的 Docker 知识
查看>>
JavaSE学习笔记(六)——类的继承
查看>>
java代码编写出现的陷阱-2:阴沟里翻船
查看>>
CentOS Zabbix Server安装
查看>>
Redis sort命令详解
查看>>
Linux Top 命令详解
查看>>
Don't be too serious about knowing the world
查看>>
servlet,RMI,webservice之间的区别
查看>>
Java异常架构
查看>>
Git 分支合并冲突及合并分类
查看>>
解决UnicodeEncodeError: 'ascii' codec can't encode characters in position
查看>>
Android开机广播android.intent.action.BOOT_COMPLETED
查看>>
Linux服务器信息收集
查看>>
怎样在 CentOS 7.0 上安装和配置 VNC 服务器
查看>>
学习 SQL 语句 - Select(2): 指定表中的字段
查看>>
iptraf
查看>>
Tomcat JDBC pool源码部析
查看>>
a 伪类在IE6下优先级大于class
查看>>
iOS 导出 ipa 包时 四个选项的意义
查看>>
我的友情链接
查看>>