zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JS高级--函数进阶(原型、调用方法、this、bind、严格模式、闭包、垃圾回收、递归深拷贝、匿名函数、回调函数、立即执行函数)

JS方法执行模式递归 函数 -- 调用
2023-09-11 14:16:32 时间

函数定义方式

function fn(){}//命名函数

var fun=function(){}//匿名函数

// new fn=new Funcion("参数1","参数2","函数体"),很少用。
//所有函数都是Function的实例对象(函数也是对象)
var fn=new Funcion("a","b","console.log(a+b)")
console.log(fn instanceof Object)//true

 函数的调用(6种)

 

 

 

 this指向问题

this 指向详细解析(箭头函数) - Chris-dc - 博客园

总结js的this面试题_loringray的博客-CSDN博客_js this面试题

1.普通函数:window

2.对象方法:实例对象obj1

3.构造函数:实例对象。原型对象里面的this指向的也是 ldh这个实例对象

4.绑定事件函数:事件的调用者button1

5.定时器:window

6.立即执行函数:window

改变函数内部this指向:call(),apply(),bind(),

 

 

 如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind

 

 严格模式

 为整个脚本开启或为函数开启:“use strict”;

 严格模型的语法规范:

1.变量使用前必须声明

2.我们不能随意删除已经声明好的变量

3.严格模型下的全局作用域中函数中的this是undefined

4.构造函数不加new调用,this指向undefined,给undefined赋值会报错(。以前指向window,相当于给window添加属性了)

 5.定时器this还是指向window 。事件、对象还是指向调用者。

6.参数不能重名 

7.函数必须声明在顶层.新版本的JavaScript 会引入“块级作用域”(ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。

 高阶函数

定义:高阶函数是对其他函数进行操作的函数,它接收函数作为参数(回调函数)或将函数作为返回值输出。

闭包

闭包( closure )指“函数”和“函数能访问到的变量”的总和。简单理解就是,通过函数嵌套的方式,使得内部函数可以访问外部函数中定义的把变量。

闭包中定义的变量在内存中的位置:被内部函数引用到的变量被放在堆内存中(即使是基本数据类型),未被引用的变量放在栈内存中,函数执行完就被释放。

闭包的作用:延伸变量的作用范围

 闭包练习:

已知:绑定事件、定时器都是异步操作,不会立即执行。

(function(i){...})(i) 立即执行函数会立即执行,参数传给尾部的小括号,function里面的小括号会再次接收这个参数。立即执行函数也称作小闭包,里面的所有函数都可以访问它内部变量。

(1)点击输出当前索引号(面试常见)

 (2)延迟三秒输出<li>中内容 

 (3)

 

 闭包的思考:

 

垃圾回收:

通常采用的垃圾回收机制有两种方法:标记清除,引用计数。js中最常用的垃圾回收方式就是标记清除。

1.标记清除

        在一个函数中声明一个变量,就将这个变量标记为"进入环境",从逻辑上讲,永远不能释放进入环境变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为"离开环境"。

        垃圾回收机制在运行的时候会给存储在内存中的所有变量都加上标记(可以是任何标记方式),然后,它会去掉处在环境中的变量及被环境中的变量引用的变量标记(闭包)。而在此之后剩下的带有标记的变量被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾回收机制到下一个周期运行时,将释放这些变量的内存,回收它们所占用的空间。

2.引用计数

        语言引擎有一张"引用表",保存了内存里面所有资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。(循环引用出问题)

递归:函数里面调用自己,需要有结束条件

深拷贝与浅拷贝:

1.浅拷贝:只拷贝最上面一层,深层的对象只拷贝了地址,所以原深层数据改变会引起拷贝过来的深层数据改变

Object.assign(objNew,objOld)

2.深拷贝:把所有深层数据值全部拷贝到新对象里面。新旧两个对象的数据修改互不影响。

匿名函数:

匿名函数:就是定义时未直接指定名称的函数

因为非匿名函数在定义时,就已经创建函数对象和作用域对象;所以,即使未调用,也占用内存空间;

匿名函数,仅在调用时,才临时创建函数对象和作用域链对象;调用完,立即释放,所以匿名函数比非匿名函数更节省内存空间

匿名函数的应用:回调函数、立即执行函数

 回调函数

1)什么是回调函数

自己定义、没有调用、但是最终执行了 的函数

2)常见的回调函数

DOM事件回调函数 .οnclick=function(){...}

定时器回调函树 setTimeout(function(){...},2000)

AJAX请求回调函数

生命周期回调函数

IIFE(立即执行函数表达式)

作用:隐藏实现,外面看不到。不会污染全局命名空间。用它编写JS模块

(function (){...})() //匿名函数自调用