Js学习小结(二)函数

(一)声明函数

  1. 直接量(字面量)声明
    function f1(){
        ...
    }
  1. 表达示声明
    var f2 = function(){
        ...
    }
  1. 内置构造函数声明(使用此方式情况很少,一般不用,所以就不过多赘述)
    var f3 = new function();

(二)调用函数

  1. 直接量声明函数调用
    f1();
    function f1(){
        console.log(111);
    }
    f1();

结果:

111
111

声明前后都可调用

  1. 表达示声明函数调用
    f2();
    var f2 = function(){
        console.log(222);
    }
    f2();

结果:

    异常:f2不是一个方法(原因:js的变量和函数提升)
    222

只能先声明后调用

(三)函数的形参和实参

以后更新

(四)回调函数

1. 在JS中函数自身的作用域在声明的地方,而不是在调用的地方

2. 在Js中函数是被称为第一等公民,因为函数是js的一个特殊的数据类型,
JS是以值的形式来处理函数的,那么就促成JS的回调函数。

    //1.声明赋值变量a
    var a = 1;
    function f1(f){
        //3.进入f1()方法
        console.log(f);
        //4.声明赋值变量a
        var a = 2;
        //5.执行f()方法,也就是f2()【可以理解为指针或引用】,并寻找f2()声明处并执行
        f();
    }
    function f2(){
        //6.执行f2(),寻找变量a(先找到全局变量a,所以没有找到局部变量a,至于它为什么没有套娃执行和找不到局部a,这是js的运行原理,也就是js作用域链)
        console.log(a);
    }
    //2.将函数名f2传入函数f1内
    f1(f2);

结果:

[Function: f2]
1

(五)函数闭包

闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。

闭包的作用:

1.保留作用域

2.函数内外的桥梁

    //0.声明赋值全局a
    var a = 2;
    //0.声明方法f1()
    function f1(){
        //1.声明赋值局部a
        var a = 1;
        //2.声明方法f2()
        function f2(){
            //6.发现a,在作用域链中寻找a,首先找到了f1()的局部a,并打印
            console.log(++a);
        }
        //3.终止f1运行并返回f2的指针
        return f2;
    }
    //0.声明并运行f1()
    var f = f1();//4.f能够引用f2()方法,因为f还保留f2()的指针,所以f1()留在内存的数据暂且不能销毁。
    f();
    //5.执行f2(),因为f还保留f2()的指针,所以f1()留在内存的数据暂且不能销毁。
    f();
    //6.同上,因为始终保存着f1()的数据,所以以上修改的f1()的a一直都是一个值。
    f();
    //7.同上
    f();
    //8.同上

结果:

2
3
4
5

原因:
由于f1的运行结果是返回f2,那么又由于作用域链及函数自身作用域的问题,导致f1运行结束后,不能销毁变量,因此形成了闭包。

原文地址:https://www.cnblogs.com/fpgz99810/p/12227535.html

时间: 2024-10-15 08:17:31

Js学习小结(二)函数的相关文章

javascript 学习小结 (二) by FungLeo

javascript 学习小结 (二) by FungLeo 前言 前面写过一个学习小结javascript 学习小结 JS装逼技巧(一) by FungLeo 那篇博文总结的东西还是比较多的. 但是JS有很多的内容,都是很有用的知识点,不可能一下子记住.因此,我的学习小结的会一直更新. 因为学习进度的不同,可能每篇博文的长短也不一样,有的学的东西多,就长点. 查询某个字符串在某个数组中的索引值 笨方法 我的基础比较差,所以很多东西是记不住的.因此,我在需要这样做的时候,我写了如下代码 var

Backbone.js学习之二

经历一段自我修炼,终于领悟到Backbone.js的关键知识点,也发现了原来MVC可以在前端这样梦幻的发挥,Backbone.js确实是一个很有魅力的前端MVC框架. 练就一门技术,需要有扎实的功底,从这点,开始认真研究Backbone.js的一些最基本的操作,以便我日后学习能更上一层楼.那就切入主题: 什么是mvc? 简单的理解就是:模型(models),视图(views),控制器(collections).通过视图把浏览器的网址传给控制器,控制器对网址进行解析,然后去模型层获取数据,模型层将

关于闭包的理解(JS学习小结)

前言: 啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油! 因为现在期末啦,下周一也就是明天开始就有考试,所以复习是主要的事情,看书的速度比较慢了,一周大概也就184页(P110-P284), 虽然页数比较少但是其中有ES中非常最重要的两个概念——原型链和闭包,之前对于两个知识的了解算是知其然不知其所以然的,所以在那两章我也有意多花费了时间,确保我能够吃透这个概念.以下算是我自己的

JavaWeb基础—JS学习小结

JavaScript是一种运行在浏览器中的解释型的编程语言一.简介js:javascript是基于对象[哪些基本对象呢]和和事件驱动[哪些主要事件呢]的语言,应用在客户端(注意与面向对象的区分) js的三大特点: 交互性:信息的动态交互 安全性:不能访问本地磁盘的文件 跨平台性:能支持js的浏览器都能运行 JavaScript 对大小写敏感 与java的区别:(只是长得像而已,雷锋&雷峰塔)  1.不同公司开发的语言,java:Oracl js:网景公司 2.java:面向对象 js:基于对象(

[转]node.js学习笔记(二)

二.express 1.安装 express4 npm --registry=http://registry.npmjs.org install -g express-generator (全局) 2.新建express项目 express -t ejs newsproject cd newsproject npm --registry=http://registry.npmjs.org install 3.启动项目 A 修改app.js增加 其中,通过app.use('/',routes)访问

前端学习(33)~js学习(十):函数

关于函数的核心内容: 函数有哪几种定义和调用方式 this:函数内部的 this 指向.如何改变 this 的指向. 函数的严格模式 高阶函数:函数作为参数传递.函数作为返回值传递 闭包:闭包的作用 递归:递归的两个条件 深拷贝和浅拷贝的区别 函数的介绍 函数:就是将一些功能或语句进行封装,在需要的时候,通过调用的形式,执行这些语句. 函数也是一个对象 使用typeof检查一个函数对象时,会返回function 函数的作用: 将大量重复的语句抽取出来,写在函数里,以后需要这些语句的时候,可以直接

JS学习三(函数)

[函数的声明格式] 1.函数的声明格式: function 函数名(参数1,参数2,...){ 函数体代码 return 返回值: } 函数的调用: ① 直接调用:函数名(参数1的值,参数2的值,....); ② 时间调用方式:直接在html标签中,使用事件名="函数名()" <button ondblclick="saySth('哈哈哈','yellow')">点击按钮,打印内容</button> 2.函数的注意事项: ① 函数名必须符合小

python学习笔记(二) - 函数

一. 调用函数 python内置了一些数据类型转换函数,比如int()函数可以把其他数据类型转换为整形 >>> int('123') 123 >>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23) '1.23' >>> unicode(100) u'100' >>> bool(1) True >>> bool('') Fal

【转】require.js学习笔记(二)

require.js遵循AMD规范,通过define定义模块,require异步加载模块,一个js文件即一个模块. 一.模块加载require1.加载符合AMD规范模块 HTML: <script src="js/require.js" data-main="js/main"></script> MAIN.JS require.config({ baseUrl: "js/lib", paths: { "jquer