四、Function对象
1. 匿名函数
- 什么是:定义函数时,不指定函数名的函数
- 为什么:2大优点
- 节约内存
- 避免产生全局变量,造成全局污染
- 何时用:2种情况
- 几乎所有回调函数都要定义为匿名函数
- 匿名函数自调用
- 如何用:2种情况
- 回调函数
- 什么是:自己定义了函数,但是不由自己调用,而是交给另一个函数,由另一个函数按需自动调用-----给别人用的函数
举例1:想将一个数字内容的数组升序排列arr.sot(function(a,b){ return a-b})
补充:
sort() 方法,有一个可选参数,必须是函数,供它调用。那么就是个回调函数咯!回调函数的参数要有两个:第一个参数的元素肯定在第二个参数的元素前面!!!这个方法的排序是看回调函数的返回值: 如果返回值大于 0,则位置互换。 如果返回值小于 0,则位置不变。
举例2:想根据不同的敏感词,动态选择不同的新值替换str=str.replace(/正则表达式/,function(keyword){ return 不同新值})
- 为什么回调函数都要定义为匿名函数:为了节约内存!
- 什么是:自己定义了函数,但是不由自己调用,而是交给另一个函数,由另一个函数按需自动调用-----给别人用的函数
- 匿名函数自调:
- 什么是:定义一个匿名函数后,立刻调用该函数执行,调用后立即释放
- 为什么:避免产生全局变量,造成全局污染
- 何时用:今后一切js代码都应该放在一个大的匿名函数自调内!尽量不要使用全局变量!
- 如何做:
- 标准写法:
创建新函数,立刻调用执行var 变量名=(function(形参变量列表){ ...return 返回值 })(实参值列表);
因为该函数没有名字,所以调用后,立刻释放 - 非主流写法:
+function(){...}()
!function(){...}()
…
强调:结尾的(),必须要加,表示调用
- 标准写法:
- 示例:使用匿名函数自调避免全局污染
输出结果:<script> // 全局变量,记录程序执行的总时间 var t=0; // 第一段程序:执行0.3s !function(){ t+=0.3; console.log(`任务一耗时0.3s`); }(); // 假设之后在此处添加了以下代码,这里出错了,需要记录出错时间 (function(){ // 局部变量,碰巧和全局变量重名了,也不会影响到全局变量 var t=new Date(); console.log(`这里出错了,在${ t.toLocaleString()}`) })(); // 第二段程序:执行0.8s +function(){ t+=0.8; console.log(`任务二耗时0.8s`); }(); console.log(`共耗时${ t}s`); </script>
任务一耗时0.3s
这里出错了,在2020/5/4 下午8:21:04
任务二耗时0.8s
共耗时1.1s
- 回调函数
2. 作用域和作用域链
- 什么是作用域(scope):
- 从作用是说:作用域就是一个变量的可用的范围
- 从本质上说:作用域其实是保存变量的特殊对象
- 为什么用作用域:为了避免不同范围之间的变量互相干扰
- JS中包括2级作用域
-
全局作用域
- 什么是:在程序任何位置都可以随意访问的,专门保存全局变量的存储
-