一、函数

  函数对于任何一种语言来说都是一个核心的概念。通过函数封装多条语句,并可以在任何地方,任何时候调用,ECMAScript中规定,函数使用function关键字声明,后面跟一组参数以及函数体。

函数声明的基本方式主要是以下三种,比较常用第1、2种

//方式1
function fn1(arg0, arg1,....){ alert("这是一个函数");
}
fn1();//调用//方式2
var fn2 = function(arg0, arg1,...){"这是一个函数"
}
fn2();//方式3
var fn3= new Function('alert('这是一个函数')');
fn3();

javascript与其他语言不相同的是,在function声明中,参数并不需要指定参数的类型。ECMAScript中没有函数签名的概念,因为起函数参数是以一个包含零个或者 多个值的数组的形式传递的,使用者可以向函数传递多个参数,并且可以通过arguments对象来访问这些参数。也是由于没有函数签名,所以function函数不能重载,但是可以通过arguments对象模拟重载。

  在开发过程中,我们会常常在一个函数体内定义另一个函数体,并将其作为一个返回值返回。这个也就是所谓的闭包。

二、闭包

  闭包就是指有权访问另一个函数作用域中的变量的函数。常见的创建闭包的方式就是在一个函数内部创建另一个函数。

以下面代码为例:

function myFunction(name){return function(name){alert("你传入的名字为"+name);}
}var fn = myFunction(name);
fn("jiangZ");

myFunction()函数内部返回了另外一个函数,将其作为一个变量返回,并在fn的定义中,赋给了函数fn,就相当于fn()的函数就是:fn(name){alert("你传入的名字为"+name);}

那么使用闭包的好处就在于不产生全局变量,属性私有化。但是外部的函数可以通过这种方式调用到另外一个函数的内部变量。这就涉及到一个作用域链的问题了。

function fn(){
var value1 = 1;
var value2 = 2;
return function(){

if(value1 > value2){alert(value1);}
else{alert(value2);}
};
}
var f = fn();
f();

value1、value2是函数fn内部的私有属性,但是外部函数 f 可以访问到这两个属性。之所以可以是因为内部函数的作用域链中包含了fn()函数的作用域。当一个函数被调用时,就会创建一个执行环境以及相应的作用域链,然后使用arguments和其他命名参数的值来初始化函数的活动对象,但是在作用域链中外部函数的活动对象始终是处于第二位,外部函数的外部函数的活动对象处于第三位,以此类推,直到作为作用域链终点的执行环境。在一个函数(fn)内部定义的函数会将包含函数(即外部函数 f)的活动对象中添加到他的作用域中。也就是说fn 内部function的执行环境中实际上会包含value1和value2。所以当fn的内部函数被返回后,其作用域链被初始化为包含了fn函数的的活动对象跟全局变量。这样外部的函数就可以访问在fn中的所有变量。一般来说。局部活动对象会在执行环境结束后被销毁,但是闭包不同,就算函数执行完毕后,起活动对象仍然会存留在内存中。因为外部的函数的作用域链汉时引用着这个活动对象。直到函数被销毁后,fn的活动对象才会被销毁。所以对于使用闭包的缺点就是闭包中的数据会常驻内存,在不用的时候要删掉否则会导致内存溢出。

转载于:https://www.cnblogs.com/jiang-z/p/7604663.html

javascript--浅谈函数与闭包相关推荐

  1. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  2. 浅谈Javascript -- 【嵌套函数及闭包】

    这篇文章其实是要讲闭包的一些初级应用,但是为了将闭包,我们还是从嵌套函数开始说吧,纵使所有的JavaScript函数都可以说是闭包,但是只有当一个嵌套函数被导出到它所定义的作用域之外时,这种闭包才是有 ...

  3. ege限制鼠标移动的函数_浅谈函数节流和函数防抖

    什么是函数节流和函数防抖?下面本篇文章就来给大家浅谈一下函数节流和函数防抖.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 前言 事件的触发权很多时候都属于用户,有些情况下会产生问题 ...

  4. Javascript浅谈之this

    介绍 this在各种对面对象编程中起着非常重要的作用,主要用于指向调用的对象.不过在JavaScript中,this的表现存在很大差异,特别是不同执行上下文. 由前文我们知道this也是属于执行上下文 ...

  5. JavaScript 自执行函数(闭包)

    1. 全局污染 在变量声明的时候有一个规则:重复声明无效 var num = 123; var num = 'abc'; 重复声明的代码不会报任何错误,但是其声明特征就没有了,会转换成普通赋值语句 故 ...

  6. JavaScript 浅谈DOM节点层次:Text /Coment等类型

    浅谈DOM其他节点层次:Text .Coment. 一.Text类型--文本 Text类型表示纯文本内容,其特性有 nodeType == 3  ;  nodeName == "#text& ...

  7. 浅谈对js闭包的理解

    闭包就是能够读取其他函数内部变量的函数.由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成"定义在一个函数内部的函数".在本质上,闭包是将函数内 ...

  8. python函数调用位置_Python: 浅谈函数局部变量快在哪

    前言 这两天在 CodeReview 时,看到这样的代码 # 伪代码 import somelib class A(object): def load_project(self): self.proj ...

  9. 浅谈函数的重入与不可重入

    在学习Linux信号以后,我看到这样的一个代码. #include<stdio.h> #include<signal.h> #include<unistd.h>in ...

最新文章

  1. 在windows上使用virt-manager
  2. SecureCRT使用
  3. Java 8:功能接口示例
  4. Java 7:使用NIO.2进行文件过滤–第3部分
  5. Python高级——HTTP协议
  6. Postman接口测试工具学习笔记(二)Postman进阶实践:获取天气预报实例
  7. Java学习中的不解
  8. 滴滴翻译技术探索与实践
  9. React 解决 “cross-cutting concerns” 问题
  10. 性能课程笔记(五)性能分析思路[转载高楼]
  11. android阅读器里的 txt 文本处理分页功能的实现:
  12. 算法- C语言实现侏儒(地精)排序(Gnome_sort)
  13. 基于大数据的模型预测用户是否会进行交易 文档+答辩PPT+Python源码及数据
  14. 【后端学习】后端技术要点总结【一】
  15. Java并发工具Exchanger线程间交换数据
  16. 2013再见,2014,在路上
  17. oracle8i substr,Oracle中INSTR和SUBSTR的用法
  18. 跨域解决的三种方法、四种请求方式
  19. UnityWebRequset Post 传输文件
  20. camera(20)---camera 客观测试 Imatest教程--解像力测试

热门文章

  1. 一般人我都不告诉他们
  2. 五万字长文总结 C/C++ 知识
  3. 2018中国智造金长城奖:创新能力与行业竞争力并重
  4. 传奇服务器端如何修改称号,图文解说传奇人物称号设置详细步骤
  5. PHP指定日期(时间戳转换)
  6. 实时显示当前时间,每秒更新
  7. 数字孪生数字工厂 数字孪生工厂解决方案
  8. Python wxPython基本教程
  9. m基于simulink的麦克纳姆轮Back-Stepping控制系统仿真
  10. 2.基础语法:手指抽筋模拟器