博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 函数、闭包
阅读量:2422 次
发布时间:2019-05-10

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

目录

 

函数

使用函数的意义:封装代码,方便调用、复用。

 

函数的定义、调用

// 定义函数常用的方式function f1(){
console.log(1);}var f2=function(){
console.log(2);}// ES6的箭头函数常用来代替匿名函数,()中写参数var f3=() => {
console.log("3")}// 在事件监听中也常用匿名函数// 通过函数名来调用f1();

注意:加上()是直接调用函数,如果是指定事件监听的处理函数,直接写函数名,不加()。

 

函数传参

//函数传参。形参直接写参数名,不加varfunction f4(name,age){
console.log(name); console.log(age);}// 调用f4("chy",20);//不定个数的参数function sum(){
var sum=0; for(var i=0;i

js的函数参数是把实参的值copy一份传给形参(浅拷贝),

如果参数是基本类型,则对形参的修改不会影响实参;
如果参数是数组、对象这些引用类型,传递的是引用(地址),对形参的修改就是对实参的修改。

 

函数返回值

function sum(a,b){
return a+b; //return会终止函数执行}var result=sum(1,2);console.log(result);

return不是必需的,如果没有return,默认返回undefined。

return只能返回一个值,如果要返回多个值,可以放在数组、对象中返回。

 

变量作用域

当前文件中的所有script标签,不管是src引入脚本,还是自己现写脚本,都可以看成在一个script标签内。

在函数内部定义的变量是局部变量,只能在函数内部使用;

在函数外部定义的变量是全局变量,在整个文件的script脚本中(包括函数中)都可用。
如果有同名的全局变量、局部变量,在局部变量的作用域内,局部变量会覆盖同名的全局变量。

作⽤域链:只有在当前作⽤域内找不到定义,才会向⽗级作⽤域

找,一级一级往上找,直到找到,如果到最外层作用域还找不到就报错。

 

闭包

function f1(){
var a = 1; // 返回内部函数的引用 return function(){
// 内部函数中使用外部函数中的局部变量 a++; console.log(a); };}// 这是内部函数引用var f2 = f1();// 调用内部函数f2(); //2f2(); //3

 

闭包的特点

  • 函数嵌套函数,外部函数返回内部函数的引用。
    定义内部函数的时候,不能function(){ }这样直接定义,需要把函数引用赋给变量,或者写成匿名函数。
  • 内部函数引用外部函数中的变量

 

闭包的优点

  • 外部可以访问局部变量。
    通过调用内部函数间接访问外部函数中的局部变量。
  • 外部函数、内部函数中的局部变量长期保存在内存中,不会被gc回收。
    外部函数的变量被内部函数使用,内部函数的引用又被全局变量使用,外部函数执行完毕后,这些被内部函数引用的变量不会被gc回收,内部函数中的局部变量也不会被gc回收,可以长期保存局部变量,相当于缓存
  • 外部函数定义的内部函数,可以外部函数自己使用,也可以在全局中使用(方法暴露出来了)

 

闭包的缺点

  • 局部变量长期保存在内存中,内存消耗很大,对网页的性能有影响

    这也是不要大量使用闭包的原因

  • 在IE中可能导致内存泄漏

    因为内部函数持有外部函数方法区的引用,即使内部函数只引用外部函数的部分变量,外部函数所有的局部变量都不会被销毁,不使用的局部变量可能发生内存泄漏。
    解决办法:在外部函数的return之前删除没有被内部函数引用的局部变量。
    删除是把变量赋值为undefined,eg. a=undefined

转载地址:http://igqlb.baihongyu.com/

你可能感兴趣的文章
腾讯2017 秋招+暑期实习 笔试(编码;构造回文;字符移位;有趣的数字)
查看>>
LC 901. 股票价格跨度 LC 739. 每日温度
查看>>
【Redis深入】字典rehash图解
查看>>
java equals方法和hashCode方法
查看>>
Redis的底层数据结构(6种)
查看>>
Redis的五大数据类型实现原理
查看>>
maven依赖jar包时版本冲突的解决
查看>>
LC 446. 等差数列划分 II - 子序列
查看>>
LC 53. 最大子序和(DP)+ LC 152. 乘积最大子序列 + LC 238. 除自身以外数组的乘积
查看>>
198. 打家劫舍 DP
查看>>
628. 三个数的最大乘积
查看>>
正向代理和反向代理
查看>>
不同的类加载器加载的类不是同一个类
查看>>
Java 序列化和反序列化
查看>>
怎么让笔记本变路由器,亲身试验可用,不用下第三方软件
查看>>
DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案
查看>>
java.util.ConcurrentModificationException
查看>>
linux 通过crt直接上传和下载文件和文件
查看>>
javabase64编码原理和解码,加密案例
查看>>
Java 位运算(移位、位与、或、异或、非) 以及负数的二进制相互计算
查看>>