专栏首页萌兔itJavaScript入门总结第四弹——函数+十分钟了解闭包

JavaScript入门总结第四弹——函数+十分钟了解闭包

Hello~~偶又来咯,昨天有小可爱说数组有点随意,其实数组的应用的比较广泛,但是并不是很难,主要是不容易都记住,所以兔妞就是给大家将数组进行了一下梳理,总结了一下使用技巧呢~~今天是函数专题呢,也主要为大家揭秘一下闭包~

函数基础

函数定义

a) 函数声明

function myRabbit(a){

return 2*a;

}

b) 函数表达式

var myRabbit = function (a){

return 2*a;

}

c) 构造函数

var myRabbit = new Function ("a", "b", "return a * b");

var rabbit = myRabbit(1, 2);

小贴士

函数提升

提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为。

提升(Hoisting)应用在变量的声明与函数的声明。

不只是变量会提升,函数也会提升,因此函数可以在声明之前使用。

函数参数

函数参数分为显式参数(Parameters)与隐式参数(Arguments)

‍‍

小贴士

参数规则

JavaScript 函数定义显式参数时没有指定数据类型。

JavaScript 函数对隐式参数没有进行类型检测。

JavaScript 函数对隐式参数的个数没有进行检测。

JavaScript函数有一个叫做arguments的对象,包含调用的参数数组,如下

x = rabbitFamily(1, 2, 5, 2, 4, 8); function ageSum() { var i, sum = 0;

for (i = 0; i < arguments.length; i++) { sum += arguments[i];

} return sum;

}

函数调用

a) 作为函数调用:funcName + ()

function myRabbit(a, b) { return a * b;

}

myRabbit(10, 2);

b) 作为方法调用

var myGirlfriend = { firstName:"Jane",

lastName: "Miller",

fullName: function () { return this.firstName + " " + this.lastName;

}

}

myGirlfriend.fullName();

c) 作为函数方法调用:通过call(), apply()来调用函数,两个方法的第一个参数必须是对象本身。

function myRabbit(a, b) { return a * b;

}

myRabbit = myRabbit.call(myRabbit, 10, 2);

d) 使用构造函数调用:创建一个新的对象,并继承构造函数的属性和方法

function myGirlfriend(arg1, arg2) { this.firstName = arg1;

this.lastName = arg2;

}

var x = new myGirlfriend("Jane","Miller");

x.firstName;

e) 自调用

(function () {

var x = "萌兔it!!";

})();

十分钟了解闭包

终于到这里了,闭包是JS学习中的难点之一,面试的时候也是面试官从来不会放过的一个考点,因为我们在工作过程中,真的会经常面对闭包。

a) 变量作用域

作为闭包的先导知识,兔妞首先在这里现为大家介绍一下JS的变量作用域。变量作用域包括全局变量和局部变量。全局变量是指声明在函数外部的变量,如果在函数内声明没有加var则也是全局变量,而局部变量则是声明在函数内部的变量。

b) 闭包

我们访问变量的时候,从内部向外部逐层访问,对于父级作用域的变量,子作用域全部能够访问,这就是链式作用域。

而我们想从外部作用域访问内部作用域的变量呢,只能通过将内部函数作为返回值返回来获取,而这就是闭包。闭包就是能够读取其他函数内部变量的函数,函数没有被释放,整条作用域链上的局部变量都将得到保留。(说白了就是一个函数套一个,里面的函数作为外面函数的返回值返回)

闭包demo:

function f1(){

  var n = 1;

  nAdd = function(){

    n += 1;

  }

  function f2(){

    console.log(n);

  }

  return f2;

}

c) 闭包的用途

读取函数内部的变量

让变量的值始终保持在内存中

d) 闭包的特点

闭包会让变量都被保存在内存中,内存消耗很大,可能导致内存泄露。解决方法:在退出函数之前,将不使用的局部变量全部删除。

闭包会在父函数外部,改变父函数内部变量的值。

好了,今天的内容就是这些了,不知道大家有没有理解什么是闭包呢~~喜欢兔妞的文章,就请点击好看让更多人看到吧,么么哒~~

本文分享自微信公众号 - 萌兔it(mengtu_it)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Egg框架的日志链路追踪实践

    实现全链路日志追踪,便于日志监控、问题排查、接口响应耗时数据统计等,首先 API 接口服务接收到调用方请求,根据调用方传的 traceId,在该次调用链中处理业...

    五月君
  • Kafka消费者 之 如何提交消息的偏移量

    由于消费者模块的知识涉及太多,所以决定先按模块来整理知识,最后再进行知识模块汇总。

    create17
  • 微服务Consul系列之集群搭建

    在上一篇中讲解了Consul的安装、部署、基本的使用,使得大家有一个基本的了解,本节开始重点Consul集群搭建,官方推荐3~5台Server,因为在异常处理中...

    五月君
  • 各种漏洞组合拳打出不一样的姿势

    无意之中,发现 ZZZCMS 后台任意文件读取漏洞,发现这个漏洞的时候第一反应是很鸡肋。后来,在上厕所的时候突然想到一件事。这款 CMS 还存在 CSRF 和 ...

    信安之路
  • Node.js 入门你需要知道的 10 个问题

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它是一个开源和跨平台的服务端应用程序。任何人都可以编写 JavaScri...

    五月君
  • Node.js结合RabbitMQ延迟队列实现定时任务

    RabbitMQ本身是不支持的,可以通过它提供的两个特性Time-To-Live and Expiration、Dead Letter Exchanges来实现...

    五月君
  • Java 中的 String 真的是不可变的吗?

    我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。

    Java技术栈
  • C#迭代器与LINQ查询操作符

    (1)使用 针对集合类型编写foreach代码块,都是在使用迭代器 集合类型实现了IEnumerable接口 都有一个GetEnumerator方法 (...

    祝你万事顺利
  • 分享 10 道 Nodejs 进程相关面试题

    关于线程和进程是服务端一个很基础的概念,在文章 Node.js进阶之进程与线程 中介绍了进程与线程的概念之后又给出了在 Node.js 中的进程和线程的实际应用...

    五月君
  • 将CallBack改写成Promise

    CallBack回调函数是js的特色之一, 但CallBack回调方法, 非常容易造成回调地狱(callback hell), 回调地狱不仅形象丑陋,而且代码难...

    zhaoolee

扫码关注云+社区

领取腾讯云代金券