重温javascript --(二)函数

函数

一、定义

  1. 声明式 functon fn(){}
  2. 表达式var fn = function(){}(函数表达式一般指 匿名函数)

二、参数(形参,实参)

  1. arguments 类数组对象 表示函数的实参集合

arguments.callee—指向当前执行的函数
arguments.length—指向传递给当前函数的参数数量
arguments.arguments— 返回一个新的Array迭代器对象,该对象包含参数中每个索引的值

示例:

  function test(a,b,c){// 获取实参 和实参相互映射, length与实参个数相对应// 不在严格模式下:// arguments[0]改变,会使相对应的形参也发生改变,修改形参,arguments[0]也会相应被修改// 而在严格模式则不会被修改"use strict"arguments[0] = 12console.log(a) }test(1,2,3);
  1. 函数.length – 表示函数期望的参数数量
  function nu(a,b,c,d){console.log(nu.length) // 4// 表示期望传入参数的个数,和实际传入参数的个数无关}nu(1,2)

三、预编译(执行期间上下文)

  • 预编译前了解
    1. 暗示全局变量 imply global : 即任何变量如果变量未声明赋值,此变量就为全局对象window所有
    2. 全局上的任何变量都归全局对象window所有

    window 就是全局的域
    window == GO对象

  • 预编译 步骤
    1. function预编译
      1. 创建 AO对象Active Object
      2. 形参,声明变量为 AO对象 属性,值为 undefinded
      3. 实参的值与形参的值统一
      4. 函数声明,存入 AO 对象中,函数名为属性名,函数体为值
    2. 全局预编译
      1. 生成 GO 对象
      2. 变量声明 为 GO 对象属性, 值为 undefinded
      3. 函数声明 存入 GO 对象中

示例:

// 一、预解析
// GO{
// 先找声明变量,未找到,执行时b赋值123
// b:123
// },
function a(a) {console.log(a) // 1console.log(b); // not defindvar a = b = 123;console.log(a) // 123console.log(b) // 123
}
a(1)
// AO{
// a:undefined->1
// }

四、作用域、作用域链

  1. [[scope]]:每个javascript函数都是一个对象,每个对象都有属性,有的属性能访问,有的属性不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。

    [[scope]] 就是我们所说的作用域,其中存储了执行期上下文的集合

    作用域链[[scope]] 中存储的执行期上下文对象的集合,呈链式链接,我们把这种链式链接叫做作用域链。

    示例:

    function a() {function b() {var b = 1;aa = 123;global = '局部'function c() { } // 执行b 才会定义 c; 不执行函数,永远不读取函数内部}var aa = 444;b();console.log(aa); // 123console.log(global); // 局部
    }
    var global = '全局';
    a();
    //1. a 定义 a.[[scope]] ---->0: GO{a:function} // 所谓定义就是执行前定义
    // 2.a 执行 a.[[scope]] --- > 0: AO{b:function} a 的 AO对象 
    //  ----> 1: GO{} 
    // 3. b 定义 b.[[scope]] -------> 0: AO{ b:function }
    // -------> 1:GO{}
    // 4. b 执行 b.[[scope]] ---------> 0: AO{c:function} b 的AO对象
    //                       ----------->1: AO{b:function} a 的AO 对象
    //                      -----------> 2: GO{} a 的 GO 对象
  2. 立即执行函数 一般设置初始值或者执行一次;只有表达式才能执行

    	(function(){}());(function(){})();+ function(){}();- function(){}();... || function(){}(); ... && function(){}()
    

    示例:实现索引

    // 第一种情况:
    function a() {var arr = [];for (var i = 0; i < 5; i++) {// 一直在替换AO对象内的iarr[i] = function () {console.log(i)}};return arr;
    }
    var test = a();
    for (var j = 0; j < 5; j++) {test[j]();
    }
    // 输出:5,5,5,5,5// 第二种情况:
    function a() {var arr = [];for (var i = 0; i < 5; i++) {(function (j) {arr[j] = function () { // 定义fun时站立于立即执行函数的AO对象内console.log(j); // 读取的是AO对象内的j}}(i))};return arr;
    }
    var test = a();
    for (var j = 0; j < 5; j++) {test[j]();
    }
    // 输出 0,1,2,3,4
    

五.闭包

  1. 什么是闭包

简单来说,闭包就是一个内部函数能够访问和操作其外部函数变量的函数
当内部函数保存到外部时,将会生成闭包

示例:

function a() {var aa = []function b() {var bb = 'bbbbb参数'aa = function () {console.log(bb)}};b();return aa;
};
var test = a();
test();
// a 定义 a.[[scope]] ----->GO{}
// a 执行 a.[[scope]]   ---->0: a AO{aa: []],b()}
//                     ----->1: GO{ }
// b 定义 b.[[scope]]   ---->0: a AO{aa: undefined,b()}
//                     ----->1: GO{ }
// b 执行 b.[[scope]]   ---->0:bAO{bb:...}
//                      ---->1: a AO{aa: [function()],b()}
//                     ----->2: GO{ }
  1. 闭包的作用
    闭包有两个主要的功能:保存保护
  • 保存功能使得闭包能够记住并访问其词法作用域,即使该函数在其词法作用域之外执行。
  • 保护功能则允许闭包对变量进行私有封装,防止变量被外部随意修改,同时也防止了命名空间的污染。
  • 用途:
    1. 实现共有变量
    2. 可以做缓存
    3. 可以实现封装,属性私有化,私有化变量
    4. 模块化开发,防止污染全局变量

示例一:简单的计数器, 实现共有变量

function createCounter() {  var count = 0; // 私有变量  return {  increment: function() { // 公开方法,用于增加计数器  count++;  },  getCount: function() { // 公开方法,用于获取计数器的值  return count;  }  };  
}  // 使用createCounter函数创建一个计数器实例  
const counter = createCounter();  // 调用公开方法来增加计数器的值  
counter.increment();  
counter.increment();  // 获取计数器的值  
console.log(counter.getCount()); // 输出:2

示例二:实现缓存

function A() {var num = 1;function B() {num++;console.log(num);}function C() {num--;console.log(num);}return [B, C]
}
var arr = A();
arr[0](); // 2
arr[1](); // 1
  1. 闭包的缺点
    闭包可能导致内存泄漏的问题,因为闭包可以保留其外部环境的引用,如果这部分环境很大或者生命周期很长,就可能导致不必要的内存占用。

注意:

if 条件句中的 function 会被编译成 函数表达式, 声明会被提升到当前作用域的最顶部, 但是赋值会被留在原地

示例:

function fn() {console.log('哈哈哈');
}
(function () {if (false) {function fn() {console.log('啦啦啦');}}fn(); //  fn is not a functionconsole.log(fn) // undefined// if 中 function 被预编译成表达式,赋值留在原地,所以立即执行函数AO中{fn:undefined}; 执行赋值,不执行不赋值
}());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript学习笔记7-枚举

在 TypeScript 中&#xff0c;枚举&#xff08;Enum&#xff09;是一种数据类型&#xff0c;用于定义一组具名的常量值。 枚举可以帮助开发人员在代码中使用可读性更强的符号来表示固定的数值或状态。 枚举的定义类似于对象字面量&#xff0c;其中包含一组键值对&#xff0c;键…

工厂方法模式设计实验

【实验内容】 楚锋软件公司欲开发一个系统运行日志记录器&#xff08;Logger&#xff09;。该记录器可以通过多种途径保存系统的运行日志&#xff1a;例如通过文件记录或数据库记录&#xff0c;用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时&#…

【智能算法】回溯搜索算法(BSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2013年&#xff0c;P Civicioglu等人受到当前种群与历史种群之间的差分向量的引导启发&#xff0c;提出了回溯搜索算法&#xff08;Backtracking Search Algorithm, BSA&#xff09;。 2.算法原理…

刷题训练之二分查找

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握二分查找算法 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

(十五)C++自制植物大战僵尸游戏僵尸基类讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 在游戏中,最重要的两个类别就是植物与僵尸。僵尸可以对植物进行攻击,不同的僵尸攻击方式可能会不同,但是不同又有许多相同的属性。在基类(父类)中定义僵尸共有属性,供派生类(子类)继承。 僵尸状态转换 僵尸…

【漏洞复现】润乾报表 servlet/dataSphereServlet 任意文件上传漏洞

0x01 产品简介 润乾报表是一个纯JAVA的企业级报表工具,润乾报表作为领先的企业级报表分析软件,提供了高效的报表设计方案、强大的报表展现能力、灵活的部署机制,以及支持强关联语义模型。这些功能使得润乾报表能够为企业级数据分析与商业智能提供高性能、高效率的报表系统解…

Nacos分布式配置中心

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…

Hive建表中对JSON格式的日志文件处理

【背景说明】 我正在搭建离线数仓&#xff0c;目前已经hive建表阶段&#xff0c;业务数据和(用于测试的)用户历史数据已采集到hdfs上。因用户行为日志都已JSON格式存储&#xff0c;因此需要在hive建表时指定相应格式 页面日志格式&#xff1a; {"common": { …

Android永不息屏和关闭锁屏

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

kali——勒索病毒metasploit

我先来叙述一下大致流程&#xff1a; 1、使用mfs对 445端口进行攻击获得一系列权限 2、更新mfs版本 3、使用search 17_010对命令进行查看 4、use auxiliary/scanner/smb/smb_ms17_010使用该模块设置靶机set rhosts 靶机ip和设置本机监听端口 set lhost 0-65535 5、options…

数智亚运,为什么需要智能电子桌牌?

近日&#xff0c;杭州亚运会博物馆正式对公众开放&#xff0c;深度还原了杭州从申请办、筹办至举办亚运会的各个精彩历程。馆内有“亚运与杭州”、“亚运与亚洲”“亚运与未来”三大板块展示区&#xff0c;展示了大量亚运会使用过的实物&#xff0c;还有当时引人注目的数字科技…

53、图论-课程表

思路&#xff1a; 其实就是图的拓扑排序&#xff0c;我们可以构建一个图形结构&#xff0c;比如[0,1]表示1->0&#xff0c;对于0来说入度为1。 遍历结束后&#xff0c;从入度为0的开始遍历。引文只有入度为0的节点没有先决条件。然后依次减少1。直到所有节点入度都为0.然后…

开发同城O2O跑腿系统源码:构建高效便捷的本地服务平台教程

为了满足用户对便捷的需求&#xff0c;今天我们将一同探讨如何开发一个高效便捷的同城O2O跑腿系统&#xff0c;以构建一个功能全面、操作简单的本地服务平台。 一、确定需求和功能 在开发同城O2O跑腿系统之前&#xff0c;首先需要明确系统的需求和功能。用户可以通过该系统发布…

flutter笔记-hello dart

文章目录 1. 搭建环境2. 运行官方首个程序3. AS中运行iOSAndroid 语法简述1. 变量常量字符串补充 2. 集合3. 函数关于可选报错&#xff1a;匿名函数 4. 特殊运算符5. 类 dart 包 1. 搭建环境 环境的搭建在window和mac都差不多&#xff0c;都是从官网下载对应操作系统对应版本的…

某零售企业招聘管理体系搭建咨询项目

科学岗位分析&#xff0c;改善招聘流程&#xff0c;提高招聘及时率随着公司不断发展壮大&#xff0c;企业规模逐渐增大&#xff0c;部门设置也日益增多&#xff0c;因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…

开源博客项目Blog .NET Core源码学习(17:App.Hosting项目结构分析-5)

本文学习并分析App.Hosting项目中前台页面的作品展示页面和首页页面。 作品展示页面 作品展示页面总体上为上下布局&#xff0c;上方显示导航菜单&#xff0c;下方从左向右显示图片数据&#xff0c;支持放大查看图片和下载图片。整个页面使用了layui中的面包屑导航、弹出层、流…

强化学习2:Q-learning 算法

如果对强化学习没有了解&#xff0c;推荐先学习一下&#xff1a;强化学习基本原理 1 Q-Learning&#xff1a;简介 Q-Learning 是一种基于价值迭代的强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;中的问题。在 Q-Learning 中&#xff0c;代理…

【后端】python2和python3的语法差异

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为何要了解不同版本的语法差异二、python2和python3的语法差异三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使…

SAP DMS创建文档根目录操作简介

前面我们已经对DMS的后台进行了系统的配置,本文开始我们对DMS的前台操作进行说明 1、CV01N创建文档 注意:EDIPUBLICROOTFOLDER为根目录的凭证号,不允许更改。 输入好后回车。进入下图所示: 点击文档浏览器,进入下一屏如下图: 注意:点击创建新的私人文件夹按创建是创…