272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**

  • 什么是函数?

    • 用来实现特定功能的, n条语句的封装体
    • 只有函数类型的数据是可以执行的, 其它的都不可以
  • 为什么要用函数?
    • 提高复用性
    • 便于阅读交流
  • 函数也是对象
    • instanceof Object===true
    • 函数有属性: prototype
    • 函数有方法: call()/apply()
    • 可以添加新的属性/方法
  • 函数的3种不同角色
    • 一般函数 : 直接调用
    • 构造函数 : 通过new调用
    • 对象 : 通过.调用内部的属性/方法
  • 函数中的this
    • 显式指定谁: obj.xxx()
    • 通过call/apply指定谁调用: xxx.call(obj)
    • 不指定谁调用: xxx() : window
    • 回调函数: 看背后是通过谁来调用的: window/其它
  • 匿名函数自调用:
    (function(w, obj){
      //实现代码
    })(window, obj)
    • 专业术语为: IIFE (Immediately Invoked Function Expression) 立即调用函数表达式
  • 回调函数的理解
    • 什么函数才是回调函数?

      • 你定义的
      • 你没有调用
      • 但它最终执行了(在一定条件下或某个时刻)
    • 常用的回调函数
      • dom事件回调函数
      • 定时器回调函数
      • ajax请求回调函数(后面讲解)
      • 生命周期回调函数(后面讲解)


函数

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>04_函数</title>
</head>

<body>
    <!--
1. 什么是函数?
  * 实现特定功能的n条语句的封装体
  * 只有函数是可以执行的, 其它类型的数据不能执行
2. 为什么要用函数?
  * 提高代码复用
  * 便于阅读交流
3. 如何定义函数?
  * 函数声明
  * 表达式
4. 如何调用(执行)函数?
  * test(): 直接调用
  * obj.test(): 通过对象调用
  * new test(): new调用
  * test.call/apply(obj): 临时让test成为obj的方法进行调用
-->
    <script type="text/javascript">
        /*
          编写程序实现以下功能需求:
            1. 根据年龄输出对应的信息
            2. 如果小于18, 输出: 未成年, 再等等!
            3. 如果大于60, 输出: 算了吧!
            4. 其它, 输出: 刚好!
          */
        function showInfo(age) {
            if (age < 18) {
                console.log('未成年, 再等等!')
            } else if (age > 60) {
                console.log('算了吧!')
            } else {
                console.log('刚好!')
            }
        }

        showInfo(17)
        showInfo(20)
        showInfo(65)

        function fn1() { //函数声明
            console.log('fn1()')
        }
        var fn2 = function() { //表达式
            console.log('fn2()')
        }

        fn1()
        fn2()

        var obj = {}

        function test2() {
            this.xxx = 'atguigu'
        }
        // obj.test2()  不能直接, 根本就没有
        test2.call(obj) // obj.test2()   // 可以让一个函数成为指定任意对象的方法进行调用
        console.log(obj.xxx)  /// atguigu
    </script>
</body>

</html>


回调函数

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>05_回调函数</title>
</head>

<body>
    <button id="btn">测试点击事件</button>
    <!--
1. 什么函数才是回调函数?
  1). 你定义的
  2). 你没有调
  3). 但最终它执行了(在某个时刻或某个条件下)
2. 常见的回调函数?
  * dom事件回调函数 ==>发生事件的dom元素
  * 定时器回调函数 ===>window

  * ajax请求回调函数(后面讲)
  * 生命周期回调函数(后面讲)
-->
    <script type="text/javascript">
        document.getElementById('btn').onclick = function() { // dom事件回调函数
            alert(this.innerHTML)
        }

        //定时器
        // 超时定时器
        // 循环定时器
        setTimeout(function() { // 定时器回调函数
            alert('到点了' + this)
        }, 2000)

        /*var a = 3
        alert(window.a)
        window.b = 4
        alert(b)*/
    </script>

</body>

</html>


自调用函数IIFE

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>06_IIFE</title>
</head>

<body>
    <!--
1. 理解
  * 全称: Immediately-Invoked Function Expression
2. 作用
  * 隐藏实现
  * 不会污染外部(全局)命名空间
  * 用它来编码js模块
-->
    <script type="text/javascript">
        (function() { //匿名函数自调用
            var a = 3;
            console.log(a + 3);
        })();
        var a = 4;
        console.log(a);

        ;
        (function() {
            var a = 1;

            function test() {
                console.log(++a);
            }

            window.$ = function() { // 向外暴露一个全局函数
                return {
                    test: test
                }
            }
        })();

        $().test(); // 1. $是一个函数 2. $执行后返回的是一个对象
    </script>

</body>

</html>


函数中的this

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>07_函数中的this</title>
</head>

<body>
    <!--
1. this是什么?
  * 任何函数本质上都是通过某个对象来调用的,如果没有直接指定,就是window
  * 所有函数内部都有一个变量this
  * 它的值是调用函数的当前对象
2. 如何确定this的值?
  * test(): window
  * p.test(): p
  * new test(): 新创建的对象
  * p.call(obj): obj
-->

    <script type="text/javascript">
        function Person(color) {
            this.color = color;
            console.log('此时的this是:', this);
            // console.log(this.color);

            this.getColor = function() {
                console.log(this)
                return this.color;
            };
            this.setColor = function(color) {
                console.log(this)
                this.color = color;
            };
        }

        Person("red"); //this是谁? window  【控制台输出 此时的this是: Window】

        new Person('pink'); // Person?{color: "pink"} 【因为new的最后会返回创建的新对象。】

        var p = new Person("yello"); // this是谁? p 【Person?{color: "yello"}】

        p.getColor(); //this是谁? p 【Person?{color: "yello", getColor: ?, setColor: ?}】

        var obj = {
            aa: 11
        };
        p.setColor.call(obj, "black"); // this是谁? obj  【{aa: 11}】

        // 【把p.setColor函数的内存地址复制给test,test指向p.setColor函数。】
        var test = p.setColor;
        test(); // this是谁? window

        function fun1() {
            function fun2() {
                console.log(this); // window
            }

            fun2(); //this是谁? window
        }
        fun1();
    </script>
</body>

</html>

原文地址:https://www.cnblogs.com/jianjie/p/12240674.html

时间: 2024-10-06 20:10:52

272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**的相关文章

深入理解JavaScript系列(4):立即调用的函数表达式

前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法也不一定完全对,主要是看个人如何理解,因为有的人说立即调用,有的人说自动执行,所以你完全可以按照你自己的理解来取一个名字,不过我听很多人都叫它为“自执行”,但作者后面说了很多,来说服大家称呼为“立即调用的函数表达式”. 本文英文原文地址:http://benalman.com/news/2010/11/immedia

Generator函数的理解和使用

原文:https://blog.csdn.net/ganyingxie123456/article/details/78152770 Generator函数的理解和使用 Generator 函数是 ES6 提供的一种异步编程解决方案. 一.异步编程 1.所谓"异步",简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段. 2.异步编程方式: (1)回调函数 (2)事件监听 (3)发布/订阅者 (4)Promise对象 3.所谓回调函数,就是把

Java中通过脚本引擎调用js函数

1 import java.io.*; 2 import javax.script.Invocable; 3 import javax.script.ScriptEngine; 4 import javax.script.ScriptEngineManager; 5 import javax.script.ScriptException; 6 import org.slf4j.Logger; 7 import org.slf4j.LoggerFactory; 8 import com.ppcre

我的第一个调用Intrinsics函数的程序

TestSSE.cpp #include "counter.h" #include <intrin.h> #include <stdlib.h> #include <math.h> /* 标题:我的第一个调用Intrinsics函数的程序 所属项目名称:TestSSE 项目类型:Win32控制台项目 依赖:counter.h文件//提供计时功能 描述:以前需要使用汇编对CPU的指令集进行优化,现在可以直接使用Intrinsic函数达到类似效果, 可读

JS 对于回调函数的理解,和常见的使用场景应用,使用注意点

  很经常我们会遇到这样一种情况: 例如,你需要和其他人合作,别人提供数据,而你不需要关注别人获取或者构建数据的方式方法. 你只要对这个拿到的数据进行操作. 这样,就相当于我们提供一个外在的函数,别人调用这个函数,返回相应的数据. 例如: ? 1 2 3 4 5 6 7 8 function (num , numFun) { if(num < 10){ //do sth }else { //do sth numFun(); } } 在num的判断之后执行NumFun的函数. 所谓的回调函数,可以

JS回调函数(理解篇)

概述: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 定义: 在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A.我们就说函数A叫做回调函数.如果没有名称(函数表达式),就叫做匿名回调函数. 因此callba

关于js的callback回调函数的理解

回调函数的处理逻辑理解: 所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列取出来并自动执行(激活回调函数的代码),实现异步的编程效果. 不过,对于一些必须要等回调函数执行完毕才可以确定的动作,实际上,就是会掉入一个层层回调的局面了.这点也是回调函数的复杂的地方! 换句话说,只要您要获取的值是要被回调才确定的,那接下来的所有代码都必须用回调的方式来编写

js回调函数(callback)理解

Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函数了.不懂啊,于是在google回调函数,发现网上的中文解释实在是太“深奥”了,我承认自己才疏学浅了.看了几个回调的例子后,貌似有点理解了.下面是我对回调函数的理解,要是理解错了,请指正,不甚感激. 首先还是从jquery网站上的英文定义入手,身为国人,我真感到悲剧.一个回调的定义被国内的“高手”解

Android中回调函数的理解---本人Android纯新手

本人大二,刚刚接触Android,也刚刚申请的cnblog博客,说一下对Android中回调函数的理解,Android中回调函数和C++.JAVA中的默认构造函数差不多,即运行到了一定的代码时自动调用的代码,而Android中的回调函数和C++.JAVA中的默认构造函数的区别在于:C++.JAVA中的默认构造函数在创建一个对象时自动调用,而Android中的回调函数的自动调用是在比如按了HOME键之后.