[前端学习]JS高级部分学习笔记,第二天

函数进阶

定义函数的方式

  • 声明函数function xxx(){} 这种方式是最直接的声明方式,js执行时这种方式会被预解析(声明提升)
  • 函数表达式var fn = function() {};这种方法是通过赋值,将函数赋值给变量,预解析只有变量和函数本身,赋值操作不会,所以这种方式函数不会被预解析
  • 构造函数方式var fn = new Function('参数','参数','内部代码');这种定义方式不会用,执行速度慢,只做了解
  • 另外在新版浏览器中,if语句中的函数声明不会被预解析,但老版浏览器又会。所以如果想通过判断条件来声明函数,又要顾及兼容性,可以用表达式的方式

伪变量this

  • this是函数内部的伪变量,用于指向调用者。关于它的指向其实完全不会混淆,谁调用了该函数,那么this就指向谁,记住这一点就行

函数对象的成员进阶

  • 前面已经说过了函数就是一个对象,它有默认的属性和方法。下面说下call、apply、bind的进阶用法
  • .call(改变指向对象,方法对应参数)这个方法的作用是调用函数,并修改函数内部this的指向
    • 进阶用法举例:比如一个伪数组(数组的形式,但没有通过Array构造函数创建,所有不能使用原型对象中的默认方法)。如果我们想要让这个伪数组也使用数组的方法,那么可以Array.prototype.push.call(伪数组);,这样实际上是让构造函数调用方法,但是通过call来改变指向,达到目的。这只是一个用法,不是唯一
  • .apply(改变指向对象,数组)这个方法的作用是调用函数,并修改函数内部this的指向,并且参数是数组的形式传入,它会在自动拆分数组将值依次传入
    • 进阶用法举例:Math.max()这个方法可以返回一组数字中的最大值,但是它的参数只能是一组数字,不能是数组。这个时候就可以Math.max.apply(Math, 数组),通过apply方法自动拆分数组后,就能直接实现了。注意这里第一个参数因为不涉及改变指向,所以传它本身调用者即可
  • .bind(改变指向对象,方法对应参数)这个方法的作用是修改函数内部this的指向,并返回一个新的函数,不会直接调用
    • 进阶用法:它主要的应用场景是在函数不需要立刻调用的时候。比如函数作为一个参数,或者作为一个赋值对象时。当时并不需要立即执行函数,就可以用它
  • aguments函数中默认有这个变量,也有这个属性(不是同一个),但是作用都是相同。用来记录传入的实参,它本身是一个伪数组。在不确定传入实参的情况下,可以用它直接获取到,较常用需要掌握
  • caller属性记录该函数的调用者
  • name属性记录函数名
  • length属性记录形参个数

高阶函数

  • 当一个函数作为参数或者作为返回值的是,它就是高阶函数
  • 函数作为参数可以通过sort方法的参数(函数)调整排序方式来理解
  • 把函数作为返回值也是很常用的。举例:很多场景下,我们需要一个函数来接受参数,但是因为参数的动态变化,如果只有一个函数,那么参数会被定死。所以我们可以返回一个函数,让返回的函数再接收值并执行逻辑,这样就是可以让参数动态变化
  • 具体可以看案例代码理解

闭包

  • 闭包是一个很抽象的概念,准确来说它是一种程序现象也是一种组合环境。在js中创建函数时,会自动生成一个作用域环境。其他部分语言中该作用域中的局部变量或函数会随着作用域执行完后销毁而变得不可访问,但在js中却不是这样
  • 哪怕作用域销毁,但是只要其他作用域访问其中局部变量或函数(内部函数或者本身),依然能够访问到
  • 所以闭包也能理解了,它是由函数和创建该函数的词法环境组合而成,它包含了该函数中所有能访问的局部变量或函数(内部函数或者本身),让它们在函数执行完销毁后仍然可以被访问
  • 闭包的作用,简单来说就是延展作用域,在某些情景下可以让功能实现更方便。但不是所有场景都一定要用闭包

定时器工作原理

  • js代码在执行时,是从上往下执行的。这是因为执行是,会把所有代码放到执行栈当中。但是定时器的参数函数并不会在执行栈中处理,而是把函数放到任务队里中进行排队。当执行栈中的代码执行完毕后,根据消息循环(就是触发条件),执行任务队列中对应的函数
  • 不光是定时器,事件触发函数也是同样的原理,也会把函数放到事件队列中。当触发事件后,会从事件队列中取出对应函数并执行

关于多次调用容易发生的理解误区

  • 假设一个对象obj它有一个方法funfun中返回值是一个函数
  • 那么输出obj.fun()()时,返回函数中的this指向的谁呢?答案是window,而不是obj
  • 因为obj.fun()这段代码执行时,this指向的是obj,执行完毕后此时obj.fun()就是返回的一个函数。再次调用返回的函数,注意返回值函数是没有对象调用的,所以默认是由window来调用的

递归

  • 递归实际上就是函数再内部不停的调用自己,在使用递归时一般都会加上一个结束条件,不然递归就是一个死循环,最终导致内存不足报错
  • 具体执行过程,可以通过断点的方式查看分析
  • 递归在使用时没必要完全想通数学逻辑,实际上只需要明白要实现的功能该怎么写,并套用对应公式即可

对象拷贝

  • 浅拷贝
    • 正常情况下如果想要拷贝一个对象,使用for in 遍历对象并依次赋值给新对象即可
    • 但是这样会出现一个问题,如果拷贝的成员中,有一个属性是对象。那么实际上拷贝的是该对象的引用地址,而不管哪个对象修改值,都会通过引用地址修改对象成员的值,那么就不是我们想要的结果了
    • 这种拷贝也叫做浅拷贝
  • 深拷贝
    • 深度拷贝就是将对象成员也进行拷贝,而不再是拷贝引用地址,这样上面的问题也就解决了
    • 具体深度拷贝实现代码查看案例,也是递归的一种应用场景
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,037评论 0 21
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,036评论 1 32
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,517评论 0 38
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,350评论 0 5
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,152评论 0 4