第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例

apply和call

apply和call都可以改变this的指向
函数的调用,改变this的指向
函数名字.apply(对象,[参数1,参数2,.....])
方法名字.apply(对象,[参数1,参数2,.....])
方法名字.call(对象,参数1,参数2,.....)
方法名字.call(对象,参数1,参数2,.....)
不同的地方:参数传递是方式不一样
只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么久可以使用apply或者call的方法改变this的指向
apply和call方法实际上并不在函数这个实例对象汇总,而是在Function的prototype中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
    /*
    apply和call都可以改变this的指向
    函数的调用,改变this的指向
    */
    function f1(x,y){
        console.log((x+y)+"======"+this);
        return "这是函数的返回值";
    }
    //apply和call调用
    var r1 = f1.apply(null,[1,2]);//此时f1中的this是window
    console.log(r1);
    var r2 = f1.call(null,1,2);
    console.log(r2);
    console.log("=============");
   //改变this的指向
   var obj = {
       sex:'男'
   };
   //本来f1函数是window对象,但是传入obj之后,f1函数此时就是obj对象的
   var r1 = f1.apply(obj,[1,2]);//此时f1中的this是obj
    console.log(r1);
    var r2 = f1.call(obj,1,2);//此时f1中的this是obj
    console.log(r2);
    </script>
</head>
<body>

</body>
</html>

bind方法,是复制一份的时候,就改变指向

bind是用来复制一份的
使用的语法
函数名字.bind(对象,参数1,参数2,......)---->返回值就是赋值之后的这个函数
方法名字.bind(对象,参数1,参数2,......)---->返回值就是赋值之后的这个方法

  function f1(x,y){
        console.log(x+y+"========"+this.age);
    }
    //复制一份的时候,把参数传入f1函数中,null默认就是this,默认就是window
//    var ff= f1.bind(null,10,20);
//    ff();
    // var ff= f1.bind(null);
    // ff(10,20);
    function Person(age){
        this.age=age
    }
    var per = new Person(1800);
    var ff = f1.bind(per,100,200);
    ff();

函数作为参数使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
    function f1(fn){
        console.log("f1的函数");
        fn();//此时fn当成一个函数来使用的
    };
    //传入匿命函数
    f1(function(){
        console.log("我是匿命函数");
    })
    //命名函数
    function f2(){
        console.log("f2的函数");
    }
    f1(f2);
    //函数作为参数的时候,如果是命名函数,那么传入命名函数的名字,没有括号
    function f3(fn){
        setInterval(function(){
            console.log("定时器开始");
            fn();
            console.log("定时器结束");
        },1000)
    }
    f3(function(){
        console.log("中间");
    })
    </script>
</head>
<body>

</body>
</html>

数组排序

var arr = [99,10,100,30,50,60,20,1]
    //排序--函数作为参数使用,匿命函数作为sort方法的参数使用,
    //那么此时的匿命函数中有两个参数
    arr.sort(function(obj1,obj2){
        if(obj1>obj2){
            return 1;
        }
        else if(obj1==obj2){
            return 0;
        }else{
            return -1;
        }
    })
    console.log(arr);
    //字符串排序
    var arr2 = ["aa-2","aa-1","ab-2","af-1","ac-1"]
    arr2.sort(function(a,b){
        if(a>b){
            return 1;
        }else if(a==b){
            return 0
        }else{
            return -1
        }
    })
    console.log(arr2);

排序功能实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
    //排序,每个文件都有名字、大小、时间,可以按照某个属性的值进行排序
    //三部电影,电影有名字,大小,上映时间
    function File(name,size,time){
        this.name = name;
        this.size = size;
        this.time = time;
    }
    var f1 = new File("haha.avi","500M","1997-12-10");
    var f2 = new File("jjj.avi","200M","2017-12-10");
    var f3 = new File("zzz.avi","100M","2007-12-10");
    var arr = [f1,f2,f3];
    //定义一个函数,定义传入要排序的属性
    function fn(attr){
        //函数作为返回值
        return function getSort(a,b){
        if(a[attr]>b[attr]){
            return 1;
        }else if(a[attr]==b[attr]){
            return 0;
        }else{
            return -1;
        }
       }
    }
    //声明传入
    var ff = fn("time");
    //函数作为参数
    arr.sort(ff);
    //循环遍历
    for(var i = 0; i < arr.length; i++){
        console.log(arr[i].name+"===="+arr[i].size+"====="+arr[i].time);
    }

    </script>
</head>
<body>

</body>
</html>

闭包

闭包的概念:函数a中,有一个函数b,函数b中可以访问函数a中定义的变量或者是数据,此时形成闭包(这句话不严谨)
闭包的作用:缓存数据,延长作用域链
闭包的优点和缺点:缓存数据
闭包的模式:函数模式的闭包、对象模式的闭包
闭包的应用:

      //函数模式的闭包
    function f1(){
        var num = 10;
        //函数声明
        function f2(){
            console.log(num);
        }
        //函数调用
        f2()
    }
    f1();
    //对象模式的闭包
    function f3(){
        var num =10;
        var obj = {
            age:num
        }
        console.log(obj.age);
    }
    f3();

闭包案例---点赞应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    ul{
        list-style: none;

    }
    li{
        float: left;
        padding-left: 20px;
        position: relative;
    }
    img{
        height: 300px;
        width: 200px;
    }
    input{
        position: absolute;
        left: 100px;
    }
    </style>

</head>
<body>
    <ul>
        <li><img src="images/1_small.png"><br/><input type="button" value="赞(1)"></li>
        <li><img src="images/2_small.png"><br/><input type="button" value="赞(1)"></li>
        <li><img src="images/3_small.png"><br/><input type="button" value="赞(1)"></li>
        <li><img src="images/4_small.png"><br/><input type="button" value="赞(1)"></li>
    </ul>
    <script>
            //获取元素
            function my$(tagName){
                return document.getElementsByTagName(tagName);
            }
            //闭包缓存数据
            function getNumber(){
                var value = 2;
                return function(){
                    this.value = "赞("+(value++)+")"
                }
            }
            var inputs = my$("input");

           //记得要写在页面加载后或者文档后

            for(var i = 0 ;i < inputs.length; i++){

                inputs[i].onclick=getNumber();
            }

            </script>
</body>
</html>

沙箱例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
    (function(){
        var str = "沙箱是啥呢";
        console.log(str);
    })();
    </script>
</head>
<body>
    <div>sthis is sanbox</div>
    <div>sthis is sanbox</div>
    <div>sthis is sanbox</div>

    <script>
    var getTag = 100;
    var objDiv = 200;
    //放到()()沙箱中就不会影响到
    (function(){
        function getTag(tagName){
        return document.getElementsByTagName(tagName);
    }
    var objDiv = getTag("div");
    for(var i = 0; i < objDiv.length; i++){
        objDiv[i].style.border = "2px solid pink";
    }
    })();

    </script>
</body>
</html>

递归

函数中调用函数自己,此时就是递归,递归一定要有结束条件
递归简单解释

 var i = 0;
    function f1(){
        //如果小于5就给执行
        i++;
        if(i<5){
            f1()
        }
        console.log("从前有座山,山里有座庙,庙里有个和尚");

    }
    f1();

递归例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
    //求n个数字的和,计算机1+2+3+4+5
    var sum = 0;
    for(var i = 0; i <= 5; i++){
        sum+=i;
    }
    console.log(sum);
    //传入x
    function getSum(x){
        //x=1时返回1
        if(x==1){
            return 1;
        }
        //递归时 x传入加上返回的x-1数一直到结束条件
        return x+getSum(x-1);
    }
    console.log(getSum(5))
    /*
    执行过程:
    执行getSum(5)---->进入函数,此时x是5,执行的是5+getSum(4),此时代码等待
    此时5+getSum(4),代码先不进行计算,先执行getSum(4),进入函数,
    执行的是4+getSum(3)...一直到getSum(1),执行到x==1 return 1,
    此时getSum(1)的结果是1,开始向外走出去
    2+getSum(1)此时的结果是:2+1
    ...
    ...
    ...
    结果:15

    */
    </script>
</head>
<body>

</body>
</html>

执行过程图

递归案例:求一个数字各个位数上数字的和 123=====1+2+3

//递归案例:求一个数字各个位数上数字的和  123=====1+2+3
    function getEverySum(x){
        if(x<10){
            return x;
        }
        //获取的是这个数字的个位数
        return x%10+getEverySum(parseInt(x/10));
    }
    console.log(getEverySum(1234));

原文地址:https://www.cnblogs.com/shapaozi/p/10309426.html

时间: 2024-10-15 15:01:14

第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例的相关文章

python开发编程基础:函数定义,返回值,参数

一,函数的定义 1,函数mylen叫做函数名 #函数名 #必须由字母下划线数字组成,不能是关键字,不能是数字开头 #函数名还是要有一定的意义能够简单说明函数的功能2,def是关键字 (define)3,():必须写4,函数体内尽量写注释,方便查看代码5,函数的调用:函数名+括号 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def mylen(): #函数名 5 ''' 6 计算字符串长度的函数 这里写的是注释,方便查看代码 7 ''' 8

linux shell自定义函数(定义、返回值、变量作用域)介绍

http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以

基本用法:2《定义函数def、返回值return、元组tuple》

2 <定义函数def.返回值return.元组tuple>  [功能] 返回函数return ' '不需要立刻print,先存起来需要再print() (1)[局部变量]和[全局变量] 1 #(1)[局部变量]和[全部变量] 2 # A.[局部变量]函数内部定义,只能内部使用,外部不能使用 3 def egg(): 4 global a # 声明a是全局变量,print(a+2) 就不会报错了 5 a=108 6 print(a+1) 7 egg() 8 print(a+2) 9 10 # B

python函数2(返回值、传递列表...)

python函数2(返回值.传递列表...) 1.返回值 1.1.返回简单的值 1 #返回简单值 2 def get_formatted_name(first_name,last_name): 3 """返回整洁的名字""" 4 full_name = first_name + ' ' + last_name 5 return full_name.title() #将首字母大写 6 7 musician = get_formatted_name(

自定义函数中的参数返回值 “-&gt; (Int -&gt; Int)”的问题

func makeIncrementer() -> (Int -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne } var increment = makeIncrementer() println(increment(7)) 这里为什么要写两个 Int->Int 这里是返回值是参数,左边是参数,右边是返回值的意思. 自定义函数中的参数返回值 "-> (Int

C++异常捕获与解决函数多参数返回

捕获异常 double divideNumber(double num1,double num2){ if (num2==0) { throw exception(); } return num1/num2; } try{ cout << divideNumber(1,3) << endl; cout << divideNumber(1,0) << endl; }catch(const exception& exp) { cout <<

函数:语法 定义 参数 返回值

函数 我们可以先去定义?个事情或者功能. 等到需要的时候直接去用就好了. 那么这里定义的东?就是一个函数. 函数是对功能或者动作的封装函数: 对代码块和功能的封装和定义 函数的语法和定义 def 函数名(): 函数体 调用: 函数名() 函数的调?: 使用函数名可以调用函数, 写法: 函数名(), 这个时候函数的函数体会被执? 函数的返回执行完函数之后. 我们可以使用return来返回结果 return : 返回 1. 当程序没写过return, 不返回任何结果. 如果你非要接收. 接受到的是N

scala基础题--函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔

函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔 import scala.io.StdIn object work02 { def main(args: Array[String]): Unit = { println("请输入一个数") var num:Int=StdIn.readInt() val pige=(num:Int)=>{ for (i<-1 to num){ for (j<-1 to num-i){ print("

转 linux shell自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu