少女学习日记——函数进阶闭包以及递归
Posted “玫瑰无原则 ”
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了少女学习日记——函数进阶闭包以及递归相关的知识,希望对你有一定的参考价值。
目录
前言
作为一个正在学习前端的小白,感觉学到面向对象编程略微的有点吃力。好记性不如烂笔头,记录下来准是没错的,多写几篇博客好好记录我的学习!这一篇主要是从函数进阶、闭包以及递归总结一下。
函数递归
函数定义
首先我们要明白:所有的函数都是Function的实例对象,也就是说所有的函数其实都是对象。通过new就可以构造一个函数对象。
构建函数的方法
- 自定义函数:function 函数名()
- 匿名函数:var fn = function()
- new Function:var fn = new Function('参数1','参数2',....,'函数体') 注意这里是字符串!
代码展示
<script>
// 自定义函数:function 函数名()
function fn1()
return "我是一个自定义函数,我的名字叫fn1";
// 匿名函数:var fn = function()
var fn2 = function ()
return "我是一个匿名函数,我没有名字。fn2是接收我的变量名不是我的名字。";
// new Function:var fn = new Function('参数1', '参数2',....,'函数体');
var fn3 = new Function('a', 'b','console.log("a和b是我的形参,我是函数体。我们都必须是字符串!")');
</script>
函数调用以及this的指向
代码展示
/* 1. 普通函数 */
function fn()
console.log('人生的巅峰');
fn();
/* 2. 对象的方法 */
var o =
sayHi: function()
console.log('人生的巅峰');
o.sayHi();
/* 3. 构造函数*/
function Star() ;
new Star();
/* 4. 绑定事件函数*/
btn.onclick = function() ; // 点击了按钮就可以调用这个函数
/* 5. 定时器函数*/
setInterval(function() , 1000); 这个函数是定时器自动1秒钟调用一次
/* 6. 立即执行函数(自调用函数)*/
(function()
console.log('人生的巅峰');
)();
高阶函数
概念
高阶函数是对其他函数进行操作的函数;函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。最典型的就是作为回调函数。
参数:接收函数作为参数;
返回值:将函数作为返回值输出。
代码展示
function add(x, y, f)
return f(x) + f(y);
//用代码验证一下:
add(-5, 6, Math.abs); // 11
当调用add(-5, 6, Math.abs)时,
参数x,y和f分别接收-5,6和函数Math.abs,根据函数定义,可以推导计算过程为:
x = -5; y = 6; f = Math.abs;
f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11;
结果就是11;
严格模式
目的
1.消除了javascript语法的一 些不合理、不严谨之处,减少了一些怪异行为。
2.消除代码运行的一些不安全之处,保证代码运行的安全。
3.提高编译器效率,增加运行速度。
4.禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的Javascript做好铺垫。比如一些保留字如: class, enum, export, extends, import, super不能做变量名.
使用模式
- 为脚本开启严格模式(IE10)
- 为函数开启严格模式
<script>
(function ()
//在当前的这个自调用函数中有开启严格模式,当前函数之外还是普通模式
"use strict";
var num = 10;
function fn()
)();
</script>
<script>
"use strict"; //当前script标签开启了严格模式
</script>
<script>
//当前script标签未开启严格模式
</script>
严格模式带来的变化
- 变量名 必须先声明再使用
- 不能随意删除已经声明的变量(delete语法 删除)
- 全局作用域下,普通函数this指向不再是 window 是 undefined
- 构造函数不加 new调用 this指向 undefined , 给它赋值则会报错
- 定时器里面的 this 指向仍然是window
- 函数不能有重名的参数
- 不允许在非函数里面使用代码块, 非函数举例:if语句 for循环
闭包及应用
概念
一个函数有权访问另一个函数作用域中的变量的函数。主要作用就是延伸了变量的作用范围,主要实现原理就是return一个闭包函数。闭包的局部变量会等所有函数调用完毕之后才销毁。
应用
递归及应用
概念
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数。
注意:递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack overflow)形式死循环,所以必须要加退出条件return。
应用
//利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * ..n
function fn(n)
if (n == 1) //结束条件
return 1;
return n * fn(n - 1);
console.log(fn(3));//结果为6
总结
这一篇学习日记就先写到这里!学习永无止境!
以上是关于少女学习日记——函数进阶闭包以及递归的主要内容,如果未能解决你的问题,请参考以下文章
好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情