函数高级应用

Excel高级函数应用总结 excel高级函数的相关知识汇总 阅读详情

一、函数的定义方式

(1)、函数声明

function fn(){

console.log('this is a function')

}

(2)、函数表达式

var fn = function(){

console.log('赋值表达式函数')

}

(3)、内置构造函数的形式

var fn3 = new Function("num1", "num2", "return num1+num2");

  console.log(fn3(2, 3));

推荐使用第二种形式,第三种用的相对较少,但也是必须掌握的内容。

二、函数的调用方法

2.函数的调用方法

(1)、函数名()

var fn1 = function () {

    console.log("函数名()");

  }

  window.fn1();

  fn1();

(2)、自调用

var fn2 = (function () {

    console.log("自调用");

  })();

(3)、call()调用

fn1.call();

(4)、对象中的函数调用

var obj1 = {

    name: "小刚",

    say: function () {

      console.log(this.name + "喜欢吃辣条!")

    }

  }

  obj1.say();

(5)、数组中函数调用

var arr = [

    100,

    "哈哈",

    function () {

      console.log(this);

      console.log(this[1] + "我是数组中的元素,也是函数");

    },

    function () {

      console.log("66666");

    },

    true

  ];

  console.log(arr[2]);

  arr[2]();//

  arr[3]();

(6)、函数作为参数的调用

function fn3(x) {

    x();

  }

  fn3(function () { console.log("我是函数也是参数"); });

(7)、函数作为返回值的调用

function fn4() {

    return function () { console.log("我是函数也是返回值!") }

  }

  fn4()();

三、闭包

(1)定义

闭包就是能够读取其他函数内部变量的函数,由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 “定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

闭包的用途

可以在函数外部读取函数内部成员

让函数内成员始终存活在内存中

原理

 实际上在js的作用域机制中,有一个作用域是永恒的,就是window全局作用域,只要浏览器窗口不关闭,全局作用域是不会销毁的,这个windows全局作用域就是永恒的,在全局作用域中定一个函数,无论调用几次,这几次调用都可以共享操作同一个全局变量。

         然而局部作用域不是啊,它只是在函数调用的时候有效,函数调用完成之后,局部作用域就关闭了,也也就意味着局部变量就失效了。所以我们在全局作用域下获取不到局部变量,再其他的作用域下也获取不到局部变量。

      但是闭包不一样啊,可以让它的父函数作用域永恒,像windows全局作用域,一直在内存中存在。这也是闭包的本质。也是咱们讲的闭包的第二个作用锁住局部变量。当闭包函数调用时,它会动态开辟出自己的作用域,在它之上的是父函数的永恒作用域,在父函数作用域之上的,是window永恒的全局作用域。闭包函数调用完了,它自己的作用域关闭了,从内存中消失了,但是父函数的永恒作用域和window永恒作用域还一直在内存是打开的。闭包函数再次调用时,还能访问这两个作用域,可能还保存了它上次调用时候产生的数据。 只有当闭包函数的引用被释放了,它的父作用域才会最终关闭(当然父函数可能创建了多个闭包函数,  就需要多个闭包函数全部释放后,父函数作用域才会关闭)。

闭包之访问函数内部变量

一些关于闭包的例子

案例一:

var name = "this window";

  var obj1 = {

    name: "this object",

    getName: function () {

      var name = "this func1";

      console.log(this.name);;//this object

      console.log(name);//this window

      return function () {

        // 闭包函数

        // var name = "this func2";

        console.log(name);//this func1

        console.log(this.name);//this window

      }

      console.log(this.name);

      console.log(name);

    }

  }

  obj1.getName()()

案例二:

function getRandom(min, max) {

    var num = Math.floor(Math.random() * (max - min) + min);

    console.log("num:" + num)

    // 闭包

    return function () {

      console.log(num);

    }

  }

  var result = getRandom(1, 10);

  result();

  result();

(4)、闭包之锁住变量

一些关于闭包的例子

// 1、随机数

  /*  function getRandom(min, max) {

     var num = Math.floor(Math.random() * (max - min) + min);

     console.log(num);

   }

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20);

   getRandom(10, 20); */

  function getRandom(min, max) {

    var num = Math.floor(Math.random() * (max - min) + min);

    return function () {

      console.log(num);

    }

  }

  var result = getRandom(10, 20);

  // console.log(result);

  result();

  result();

  result();

  result();

  result();

  result();

  result();

  result();

  /* getRandom(10, 20)();

  getRandom(10, 20)();

  getRandom(10, 20)();

  getRandom(10, 20)();

  getRandom(10, 20)();

  getRandom(10, 20)(); */

(5)、闭包案例一

一些关于闭包的例子

<script>

  // 1

  /*  function fn() {

     var name = "hello";

     return function () {

       return name;

     }

   }

   var fnc = fn();

   console.log(fnc()); */

  // 2

  /* var inner = "hi";

  function fn() {

    var inner = "hello";

    inner = function () {

      return inner;

    }

    console.log(inner());

  }

  fn(); */

  //3

  /* function fn() {

    var name = "hello";

    return function callback() {

      return name;

    }

  }

  var fn1 = fn();

  function fn2(f) {

    console.log(f());

  }

  fn2(fn1); */

  //4

  /*  (function () {

     var name = "hello";

     var fn1 = function () {

       return name;

     }

     fn2(fn1);

   })()

   function fn2(f) {

     console.log(f());

   } */

  // console.log(name);

  //5

  /*  function fn() {

     var name = 'hello'

     setName = function (n) {

       name = n;

     }

     getName = function () {

       return name;

     }

     return {

       setName: setName,

       getName: getName

     }

   }

   var fn1 = fn();

   console.log(fn1.getName());

   fn1.setName('world');

   console.log(fn1.getName()); */

  // 6

  /*  var fn = (function () {

     var arr = [];

     console.log(1);

     return function (val) {

       if (arr.indexOf(val) == -1) {

         // 数组中没有val才执行

         arr.push(val);

         console.log('函数被执行了', arr);

       } else {

         console.log('此次函数不需要执行');

       }

       console.log('函数调用完打印一下,方便查看已缓存的数组:', arr);

     }

   })();

   fn(10);

   fn(10);

   fn(1000);

   fn(200);

   fn(1000); */

  //  7

  var arr = [];

  for (var i = 0; i < 3; i++) {

    // console.log(i);

    arr[i] = (function (i) {

      console.log(i);//2

      return function () {

        console.log(i);

      }

    })(i);

    // console.log(i);

  }

  arr[0]();

  arr[1]();

  arr[2]();

  /*

    这个例子是闭包函数的一个典型应用,示例中只有两个函数嵌套,但是加上window全局作用域,

    一共会有三个嵌套作用域。其中for循环了三次,三次调用了匿名自执行函数,就开了三个函数作用域,

    开第一个作用域时保存的i的值是0,开第二个作用域保存的是1,第三个保存的是2。

    三次调用父函数,又创建了三个闭包函数,每个闭包函数沿着它自己的作用域链向上访问,访问的值就都不相同。

    三个闭包函数调用完了,它们自己的作用域就关闭了,

    但是各自的父函数作用域还一直在内存中处于打开状态,下次闭包函数再调用时,再接着访问它自己的作用域。

    就像在window全局作用域定义了一个函数,函数调用几次,全局作用域都在,每次调用都接着访问全局作用域。

  */

</script>

  1. 、闭包案例二

一些关于闭包的例子

 

4.函数递归

递归执行模型

 

5.斐波那契数列

斐波那契数,指的是这样一个数列:1123581321、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0F1=1Fn=Fn-1+Fn-2n>=2nN*),用文字来说,就是斐波那契数列由 0 1 开始,之后的斐波那契数列系数就由之前的两数相加。  

  常用的计算斐波那契数列的方法分为两大类:递归和循环。

(1)、递归

方法一:普通递归

  代码优美逻辑清晰。但是有重复计算的问题,如:当n5的时候要计算fibonacci(4) + fibonacci(3),当n4的要计算fibonacci(3) + fibonacci(2) ,这时fibonacci(3)就是重复计算了。运行 fibonacci(50) 会出现浏览器假死现象,毕竟递归需要堆栈,数字过大内存不够。

function fibonacci(n) {

    if (n == 1 || n == 2) {
        return 1
    };
    return fibonacci(n - 2) + fibonacci(n - 1);
}
fibonacci(30)

方法二:改进递归-把前两位数字做成参数避免重复计算

function fibonacci(n) {
    function fib(n, v1, v2) {
        if (n == 1)
            return v1;
        if (n == 2)
            return v2;
        else
            return fib(n - 1, v2, v1 + v2)
    }
    return fib(n, 1, 1)
}
fibonacci(30)

 方法三:改进递归-利用闭包特性把运算结果存储在数组里,避免重复计算

var fibonacci = function () {
    let memo = [0, 1];
    let fib = function (n) {
        if (memo[n] == undefined) {
            memo[n] = fib(n - 2) + fib(n - 1)
        }
        return memo[n]
    }
    return fib;
}()
fibonacci(30)

方法四:改进递归-摘出存储计算结果的功能函数

var memoizer = function (func) {
    let memo = [];
    return function (n) {
        if (memo[n] == undefined) {
            memo[n] = func(n)
        }
        return memo[n]
    }
};var fibonacci=memoizer(function(n){
    if (n == 1 || n == 2) {
        return 1
    };
    return fibonacci(n - 2) + fibonacci(n - 1);
})
fibonacci(30)

(2)、循环

方法一:普通for循环

function fibonacci(n) {
    var n1 = 1, n2 = 1, sum;
    for (let i = 2; i < n; i++) {
        sum = n1 + n2
        n1 = n2
        n2 = sum
    }
    return sum
}
fibonacci(30)

方法二:for循环+解构赋值

var fibonacci = function (n) {
    let n1 = 1; n2 = 1;
    for (let i = 2; i < n; i++) {
        [n1, n2] = [n2, n1 + n2]
    }
    return n2
}
fibonacci(30)

各种方法运行耗时如下图:普通递归>改进递归>for循环

 

ks-快手滑块验证码-Js逆向 本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。 阅读详情

相关推荐

Excel高级函数应用与技巧

本文深入探讨了Excel中几个高级函数的使用方法和实际应用场景,包括RECHERCHEV、RECHERCHEH、EQUIV、INDEX和INDIRECT等。通过具体的示例,展示了如何利用这些函数在数据查找、引用和计算中实现高效工作。

weixin_31419153的博客 599

(function(){...})()(function(){...}())

JS中函数有两种命名方式 1、一种是声明式。 而声明式会导致函数提升,function会被解释器优先编译。即我们用声明式写函数,可以在任何区域声明,不会影响我们调用。 function XXX(){}11 2、一种是函数表达式 函数表达式我们经常使用,而函数表达式中的function则不会出现函数提升。而是JS解释器逐行解释,到了这一句才会解释。因此如果调用在函数表达式之

宁静致远 617

mql5中文手册

包含语言基础、标准常量,列举和架构、MQL5程序、预定义变量、普通函数、数组函数函数转换、数学函数、字符串函数、日期和时间、账户信息、启动检测、获取市场信息、访问时间序列和指标数据、图标操作、交易函数、全局变量、文件函数、自定义指标、对象函数、技术指标、时间函数、MQL4与MQL5区别

JS 学习笔记 | 函数进阶

1.函数的定义和调用 1.1 函数的定义方式 1.1.1 函数声明 语法: function func() {}; 1.1.2 函数表达式 语法: var func = function() {}; 1.1.3 构造函数 语法: var func = new Function("参数1", "参数2",..., "函数体"); 注意: Function 里面参数都必须是字符串格式 第三种方式执行效率低,也不方便书写,所以使用较少。 所有函数都是 Function 的实例(对象) 函数也属于对象。

鲁毅的博客 360

JavaScript函数

标题函数 一:回顾 this:存在不同环境,不同的位置所代表的值是不一样的,取决于当前函数被调用时所处的环境(调用函数的对象) 事件函数:this指向触发事件对象 自定义属性 一个标签两种状态,但是标签有很多个 标签.tag = true 需要下标,但是没有,标签.index = 下标 二、函数 函数函数是由事件驱动的或者当他被调用时可重复使用的代码块 1函数应用场景 作为事件处理函数 oDiv.onclick = function(){ } 函数封装 functio

juan_bing的博客 215

函数定义语法 var fn=function(){} 和 function fn(){}的区别

在维护和编写代码的时候,经常会遇到如下两种定义函数的方式: var functionOne = function() { // Some code }; function functionTwo() { // Some code } 这两种是有区别的,一种是函数声明,一种是函数表达式。 函数声明: funName()//正常执行 function funName(){ //code } 函数表达式: funName()//报错 var funName=functio

Kun_912的博客 596

JS函数生成器,function* () {}

js函数生成器 用法如下: function* fn() { console.log(1); //暂停! yield; //调用next方法继续执行 console.log(2); } var iter = fn(); iter.next(); //1 iter.next(); //...

baidu_41921865的博客 1177

函数高级应用

在前面的课程中,我们已经学习了 Python 的基本输入输出、数据类型及其转换、顺序结构、分支结构、循环结构、循环控制语句、字符串类型、列表类型、元组类型、字典类型、集合类型、函数的定义与使用以及函数调用与作用域。本课时将介绍 Python 中函数高级应用,包括默认参数、可变参数,并通过一个具体的示例来展示函数高级用法。通过本课时的学习,你已经掌握了 Python 中函数高级应用,包括默认参数和可变参数,并通过一个具体的示例展示了如何使用这些高级特性来解决实际问题。

qq_57335683的博客 728

Python —— 函数高级应用

文章目录写在开头的话函数高级应用00. 目标01.函数参数和返回值的作用02.函数的返回值进阶2.1 函数返回值的接收2.2 面试题 —— 交换两个数字03. 函数的参数进阶3.1 不可变和可变的参数3.2 缺省参数指定函数的缺省参数提示缺省参数的注意事项1)缺省参数的定义位置2 ) 调用带有多个缺省参数的函数3.3多值参数(知道)定义支持多值参数的函数多值参数案例 —— 计算任意多个数字的和元组和字典的拆包(知道)04.函数的递归4.1递归函数的特点特点代码特点4.1递归函数的特点特点代码特点写在最后的

IDYS'BLOG 1081

python之eval函数高级应用

今天这里介绍的是eval函数高级应用,至于eval函数转换list,dict,tuple等等的转化这里就不做解释了 eval函数有什么高级应用呢? 1.可以通过字符串来调用函数方法 2.也可以调用需要传参的函数 写法: eval('c.getcode()') 注意:使用前需要把相对于的py文件事先引入 接下来咱们看个列子 我在这个方法中写了一个,td方法 td中需要传入一个参数,不...

寻鱼的猫博客 1471

10.3 Less函数高级应用

CSS预处理器,如Less,正是在这样的背景下应运而生,它们为开发者提供了编写更高效、更可维护的CSS代码的能力。无论你是刚刚接触Less的新手,还是已经有一定经验想要进一步挖掘Less潜力的开发者,本专栏都将为你提供全面、系统的学习和实践指导。通过这些高级应用,Less 函数不仅能够提高样式代码的灵活性和动态性,还能够帮助开发者构建更加复杂和强大的样式效果,满足各种设计需求。精心撰写,通过丰富的实例和深入浅出的讲解,引导读者逐步深入Less的世界,探索其在现代Web开发中的应用和优势。

Python老吕的博客 988

scala之十种函数高级应用

函数高级应用 主要包含10种函数高级应用函数传名调用 指定函数参数名调用 可变参数的函数 默认参数值函数 递归函数 高阶函数 内嵌函数 匿名函数应用函数 函数柯里化 函数传名调用 o概念说明 传值调用:先计算参数表达式的值,再应用函数内部,把=>去掉即可,即按原始的方式 传名调用:将未计算的参数表达式直接应用函数内部,用=>来设置...

findzk的博客 1318

计算机等级考试——二级MSOffice高级应用考试常用函数

应用举例:例如在 B2 单元格中有文本“未来教育计算机等级考试”,在 B1单元格中输入公式=MID(B2,8,4),表示从单元格 B2中的文本字符串中的第 8格字符开始截取 4个字符,结果为“等级考试”,应用举例:=SUMIF(B2:B10,">5",C2:C10),表示在区域 B2:B10 中,查找大于 5 的单元格,并在 C2:C10区域中找到对应的单元格进行求和。应用举例:如=MATCH(B6,B4:B8,1),返回单元格 B6在区域 B4:B8中的位置,B6在区域中是第 3 个,故返回 3。

cybersnow精通 28 门计算机语言,凭借其超凡的技术能力,成功开发过上万个应用,广泛涉及政府、商业、个人等众多领域,甚至在检察院、环保局、公安局等专业场景中也大放异彩。不仅熟练掌握单片机和物联网开发,在软件架构设计方面更是独树一帜,自创了跨平台软件 2072

c++函数高级应用

c++函数高级应用 函数默认参数 在c++函数的形参列表中的形参是可以有默认值的 语法: 返回值类型 函数(参数 = 默认值){ } 实例: #include<iostream> using namespace std; //函数默认参数 int func(int a, int b = 20, int d = 30) { return a + b + d; } //如果我们自己传入了数据,就用自己的数据,如果没有那么就用默认值 //语法: /* 返回值类型 函数(形参=

qq56hm的博客 383

函数的嵌套调用与函数高级应用

一,函数的嵌套调用 1,嵌套调用 函数的嵌套调用指的是在调用一个函数的过程中,调用另外一个函数,这种在函数内调用其他函数的方式称为嵌套调用。 function example($price,$tax){ function examples($yuan,$taxs=7.5){ return $yuan*$taxs; } $total=$price+($price*$tax); echo "...

Zhang_Ning_的博客 3597

es6箭头函数的指向

var obj={ func:()=&gt;{ console.log(this) }, func1:function (){ console.log(this) }, obj2:function(){ ...

zhangjie7467的博客 334

js第一篇(基础)

JavaScript:依赖HTML的脚本语言(网景公司的Netscape) script标签:三种写法(行内,内联,外联) 外联后script里面不需要写代码 script可以和style一样放在页面任意位置 初期建议放在/body和/html之间 注释: // /**/ 输出语句: 加载至文档流:document.write(); 用户提示:alert(); 删除前的进一步提示:confirm(); 输入框:prompt(); 调试,控制台输出:console.log(); js语法要求: 单双引号尽

weixin_44210475的博客 1240

JavaScript基础(三)

JavaScript基础(三) 函数 概述 函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 封装:把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口。 函数的声明与调用 // 声明 function funcName(params) { // function statements } funcName(params); // 调用 形参与实参 声明时传入的为形参,调用时传入的为实参。 实参个数与形参个数不匹配的情况 参数个数

鸡叉骨的博客 560

JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容。参考:JavaScript 进阶面向对象 ES6 ;ECMAScript 6 入门 系列笔记: JavaScript 面向对象编程(一) —— 面向对象基础 JavaScript 面向对象编程(二) —— 构造函数 / 原型 / 继承 / ES5 新增方法   「一」函数的定义和调用 1. 函数的定义方式 函数声明方式 function 关键字(命名函数函数表达式(匿名函数) new Function().

imByte的博客 522

闭包和递归 丨JavaScript 函数进阶

闭包(closure)指有权访问另一个函数作用域中变量的函数。----- JavaScript 高级程序设计简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。// 闭包(closure)指有权访问另一个函数作用域中变量的函数。// 闭包: 我们fun 这个函数作用域 访问了另外一个函数 fn 里面的局部变量 numfun();fn();

黑马程序员官方博客 582
上一篇: 面向对象继承
下一篇: 正则表达式
zzzlln
博客等级 码龄5年 9粉丝 39原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值