JS学习第11天——函数进阶(this指向、严格模式、高阶函数、闭包、递归)
创始人
2024-06-02 06:08:51
0

目录

  • 一、函数的定义和调用
    • 1、函数的定义方式
    • 2、函数的调用方式
  • 二、this
    • 1、this指向
    • 2、改变this指向
  • 三、严格模式
    • 1、为脚本开启严格模式
    • 2、为函数开启严格模式
    • 3、严格模式中的变化
  • 四、高阶函数
  • 五、闭包
    • 1、闭包(closure)
    • 2、在chrome中调试闭包
    • 3、闭包的作用
    • 4、思考题
  • 六、递归
    • 1、求1*2*3*...*n的阶乘
    • 2、求斐波那契数列
    • 3、根据ID返回对象的数据

一、函数的定义和调用

1、函数的定义方式

①自定义函数(命名函数) ②函数表达式(匿名函数)③new Function()(效率低,很少使用)
所有函数都是Function的实例对象,函数也属于对象
在这里插入图片描述

2、函数的调用方式

6种函数:① 普通函数 ②对象的方法 ③构造函数 ④绑定事件函数 ⑤定时器函数 ⑥立即执行函数

//  调用方式
// 1.普通函数
function fn(){};
fn();
fn.call()// 2.对象的方法
var obj = {sayHi: function () {},
};
obj.sayHi();// 3.构造函数
function Star() {}
new Star();// 4.绑定事件函数
btn.onclick = function () {};// 5.定时器函数
setTimeout(function () {}, 1000);// 6.立即执行函数
(function () {})();

二、this

1、this指向

调用方式this指向
普通函数调用window
构造函数调用实例对象,原型对象里面的方法也指向实例对象
对象方法调用该方法所属对象
事件绑定方法绑定事件对象
定时器window
立即执行函数window

2、改变this指向

JS中改变this指向的方法有:① bind()call()apply()方法
《1》call()(调用函数)

fun.call(thisArg, arg1, arg2, ...);
// thisArg:当前调用函数this的指向对象
// arg1,arg2:传递的其他参数

返回值:函数的返回值
使用场景:改变this指向并且调用该函数,比如继承(返回值是函数的返回值)

《2》apply()(跟数组相关)

fun.apply(thisArg, [argsArray]);
// argsArray:传递的值,必须包含在数组里面

返回值:函数的返回值
使用场景:主要跟数组有关系,比如借助于数学对象实现数组最大值最小值

《3》bind()(不调用函数)

fun.bind(thisArg, arg1, arg2, ...);

返回值:指定的 this值和初始化参数改造的原函数拷贝
使用场景:只想改变this指向,不调用该函数,比如改变定时器内部this指向

三、严格模式

JS除了提供正常模式外,还提供了严格模式(strict mode),严格模式IE10以上支持

开启严格模式的分类:① 为脚本开启严格模式 ② 为函数开启严格模式

1、为脚本开启严格模式

在所有语句之前放一个特定语句“use strict”;(或‘use strict’;)


有的 script 基本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他 script 脚本文件。

2、为函数开启严格模式

要把“use strict”; (或 ‘use strict’; ) 声明放在函数体所有语句之前

function fn(){"use strict";return "这是严格模式。";
}

3、严格模式中的变化

《1》变量规定
① 变量都必须先用var 命令声明,然后再使用
②严禁删除已经声明变量

《2》this指向
严格模式下全局作用域中函数中的 this 是 undefined
② 如果构造函数不加new调用, this 指向的是undefined 如果给他赋值则会报错

《3》函数变化
函数不能有重名的参数
② 函数必须声明在顶层

更多严格模式要求:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode

四、高阶函数

高阶函数是对其他函数进行操作的函数,它接收函数作为参数 将函数作为返回值输出

//  接收函数作为参数
function fn(callback) {callback && callback();
}
fn(function () {});
// 函数作为返回值输出
function fn() {return function () {};
}
fn();

典型的高阶函数应用:回调函数

五、闭包

变量根据作用域不同分为两类:① 全局变量 ② 局部变量
函数外部不能使用局部变量,当函数执行完毕,本作用域的局部变量会销毁

1、闭包(closure)

闭包:有权访问另一个函数作用域中变量函数

function fn() {  // fn就是闭包函数var num = 10;function fn2() {console.log(num);}fn2();
}
fn();

2、在chrome中调试闭包

在这里插入图片描述

3、闭包的作用

延时变量的作用范围

function fn() { var num = 10; return function { console.log(num); // 10 }
}
var f = fn();
f()

4、思考题

// 思考题 1:
var name = "The Window";
var object = {name: "My Object",getNameFunc: function() {return function() {return this.name;};}
};
console.log(object.getNameFunc()());
// 类似于
var f = object.getNameFunc();
var f = function() {return this.name;
}
f();// 思考题 2:
var name = "The Window";
var object = {name: "My Object",getNameFunc: function () {var that = this;return function () {return that.name;};},
};
console.log(object.getNameFunc()());

六、递归

递归函数:在函数内部可以调用其本身
由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

1、求123*…*n的阶乘

function fn(n) {if (n == 1) {return 1;}return n * fn(n - 1);
}

2、求斐波那契数列

function fn(n) {if (n < 3) {return 1;}return fn(n - 2) + fn(n - 1);
}

3、根据ID返回对象的数据

var data = [{id: 1,name: "家电",goods: [{id: 11,gname: "冰箱",goods: [{id: 111,gname: "海尔",},{id: 112,gname: "美的",},],},{id: 12,gname: "洗衣机",},],},{id: 2,name: "服饰",},
];
function fn(data, id) {var a = {};data.forEach((item) => {if (item.id == id) {a = item;} else if (item.goods && item.goods.length > 0) {a = fn(item.goods, id);}});return a;
}
console.log(fn(data, 11));

相关内容

热门资讯

关于边塞的诗句古诗 导语:苍茫戈壁虽有鸟飞绝,人踪灭的苍凉,也许这贫瘠而厚重的戈壁下面蕴含着丰富的宝藏,茫茫戈壁留给我的...
匈奴草黄马正肥,金山西见烟尘... “匈奴草黄马正肥,金山西见烟尘飞,汉家大将西出师。”出处 出自 唐代 岑参 的《走马川行奉送出师西征...
杜甫古诗绝句意思 杜甫古诗绝句意思  《绝句》这首诗是杜甫在成都浣花溪草堂闲居时写的,共写绝句四首,接下来由小编整理了...
倚篷窗无寐,引杯孤酌 “倚篷窗无寐,引杯孤酌。”出处 出自 宋代 张元干 的《满江红·自豫章阻风吴城山作》“倚篷窗无寐,引...
海畔尖山似剑铓,秋来处处割愁... “海畔尖山似剑铓,秋来处处割愁肠。”出处 出自 唐代 柳宗元 的《与浩初上人同看山寄京华亲故》“海畔...
于秋的诗句 有关于秋的诗句有关于秋的诗句1  1、惟有河边雁,秋来南向飞。庾信《重别周尚书》  2、戛戛秋蝉响似...
七夕的经典诗句 七夕的经典诗句  在日常的学习、工作、生活中,大家一定没少看到经典的诗句吧,不同的`诗句,其语言艺术...
李白的慈悲诗句 李白的慈悲诗句  “白也诗无敌,飘然思不群”……  一提起李白,人们首先会想起俊逸、潇洒,这些形象,...
表达思念之情诗句 表达思念之情诗句  引导语:大家知道哪些表达思念之情的诗句?下面是小编整理的.2篇,与大家分享,欢迎...
鲁迅散文的艺术特点 鲁迅散文的艺术特点  鲁迅是现代中国文学里的标志性的里程碑,他的白话文小说有如一颗巨石,沉沉地砸向当...
老舍《她那么看过我》原文及读... 老舍《她那么看过我》原文及读后感  【老舍《她那么看过我》原文】  人是为明天活着的,因为记忆中有朝...
端午节的诗句 端午节的诗句(精选60句)  在平日的学习、工作和生活里,大家一定都接触过一些使用较为普遍的诗句吧,...
菊花的诗句欣赏 菊花的诗句欣赏  那些才气四溢的诗人们,舞文弄墨,妙笔天长,将菊之美染作桃花扇底的`一抹灿烂,写作精...
劳动节的古诗 关于劳动节的古诗(精选30首)  在现实生活或工作学习中,大家对古诗都再熟悉不过了吧,古诗具有格律限...
今年元夜时,月与灯依旧 “今年元夜时,月与灯依旧。”出处 出自 宋代 欧阳修(一说朱淑真) 的《生查子·元夕》“今年元夜时,...
古风爱情诗句 古风爱情诗句(精选250句)  在现实生活或工作学习中,大家都听说过或者使用过一些比较经典的诗句吧,...
写山水的好诗句 写山水的好诗句  深林人不知,明月来相照。  木末芙蓉花,山中发红萼。  涧户寂无人,纷纷开且落  ...
念去去 千里烟波 暮霭沉沉楚... 念去去 千里烟波 暮霭沉沉楚天阔作者柳永《雨霖铃》寒蝉凄切,对长亭晚,骤雨初歇。都门帐饮无绪,留恋处...
与谷雨的诗句 与谷雨的诗句  谷雨,一个温润细腻又繁花似锦的节气。以下是小编为大家分享的与谷雨有关的`诗句,欢迎借...
韩翃《寒食》-小学生必背古诗... 韩翃《寒食》-小学生必背古诗词鉴赏  无论是在学校还是在社会中,相信很多人都记得曾经做过的古诗词鉴赏...