#前言

本文主要阐述一些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||windowsfunOut.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

通过 “函数对象”看javascript函数相关推荐

  1. js执行oracle函数吗,执行javascript函数

    JS--函数 JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function: function 函数名([参数]){ 执行的代码: } 当调用该函数时,会执行函数 ...

  2. 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包

    转载请注明出处:王亟亟的大牛之路 本来打算把工作的事周末做掉点,但是发现在外面浪并不能迅速集中投入,为了避免不必要的BUG 还是明天在家做吧,那么久写一篇Python的文章吧,毕竟背着Mac出门不做些 ...

  3. python使用复合语句def创建函数对象_Python 纯函数

    Python 纯函数,函数式编程简洁明了,因为函数可以用作其他函数的参数或者返回值,后续会给出很多这样的例子. 要做到这一点,函数必须是运行时环境中的头等对象.在C等语言中,函数不是运行时中的对象,然 ...

  4. python 返回函数对象_返回函数

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = ...

  5. 深入探讨JavaScript函数对象

    人人生而平等,但有些人比其他人更加平等--奥威尔 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解. javascript中的函数不同于其他的语言,它的每个函数都是 ...

  6. Javascript函数执行、new机制以及继承

    JS函数执行 一个JavaScript函数fn,被执行有三种途径: fn() new fn() fn.call()或fn.apply() new机制以及继承 JavaScript中定义了一种对象,称之 ...

  7. 盘点JavaScript函数的基本知识

    本文旨在提供web开发人员必须了解的所有JavaScript函数的基本知识. 函数于软件开发者而言并不是什么奇幻世界.如果你的日常活动涉及到编码,哪怕是一点点,那么在一天结束的时候,你一定创建/修改了 ...

  8. 菜鸟教程 之 JavaScript 函数(function)

    From:https://www.runoob.com/js/js-function-definition.html JavaScript 函数定义 JavaScript 使用关键字 function ...

  9. JavaScript函数和BOM及DOM编程(详细总结-无尿点)

    JavaScript函数和BOM及DOM编程(详细总结-无尿点) javascript 函数 一.javascript函数 1.1 概述 1.2 常见的系统函数 1.2.1 eval 1.2.2 pa ...

最新文章

  1. 如何访问webService接口
  2. 《PC World》:Linux在桌面市场毫无长进 已经死亡
  3. 多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...
  4. 数据结构之图:图的搜索,Python代码实现——23
  5. mybatis sql linux,通用mapper生成sql及mybatis使用过程
  6. 服务器sxs文件通用的吗,win10x sources sxs文件有什么作用
  7. asp.net回调javascript
  8. java后台处理跨域问题_用cros解决前后端分离的跨域问题
  9. xp系统怎样添加桌面计算机,如何为XP系统计算机设置桌面
  10. acm 用java_acm竞赛中使用java是一种什么体验?
  11. win10错误代码0x0000011b怎么解决
  12. mysql的msi文件下载
  13. 电脑的dns服务器未响应怎么解决,电脑DNS服务器未响应怎么解决
  14. 如何用计算机计算log除法,电脑系统自带科学计算器使用方法
  15. Unity Layer预设 默认设置Layer
  16. consume(consume名词)
  17. 请收下这份秘籍: 这里有关于申请 gTech 职位所需知道的一切
  18. WebGIS第九课:智慧校园项目(1)
  19. Linux JKD1.8 安装及配置
  20. ttkbootstrap 学习

热门文章

  1. CCNA笔记-交换机安全
  2. C#数组排序(按列)
  3. Spring对AOP的支持
  4. IDEA如何将项目中文件夹设置为Sources(蓝色)
  5. Uva10191 复合词
  6. Java-JSON 解析
  7. 转换时间对象和字符串对象添加时间
  8. [实现]Javascript代码的另一种压缩与加密方法——代码图片转换
  9. ios手势识别-单击
  10. SqlDependency学习笔记