1、函数定义与调用

  1. <script>
  2. // es5函数定义
  3. function add(x, y) {
  4. return x + y;
  5. }
  6. // 函数调用
  7. console.log(add(10, 20));
  8. //es6箭头函数定义
  9. let add1 = (x,y) => x+y;
  10. let add2 = (x,y) => {
  11. let z = 10;
  12. return x+y+z;
  13. }
  14. let classResult = (x,y) =>{
  15. let z = 10;
  16. return ({x,y,z});
  17. }
  18. // 函数调用
  19. console.log(add1(1,2));
  20. console.log(add2(1,2));
  21. console.log(classResult(1,2));
  22. </script>
  1. <script>
  2. function add(){
  3. };
  4. let add1 = () => {
  5. }
  6. let name = "azhi";
  7. let user = {
  8. //属性名和属性值是同样的可以省略
  9. name,
  10. age: 18,
  11. getUsername: function () {
  12. console.log("es5写法");
  13. },
  14. getUsername1() {
  15. console.log("es6写法,在大括号里的函数可以简化省略: function");
  16. },
  17. }
  18. console.log(user.name);
  19. </script>

2、JavaScript 全局函数

函数 描述
decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。
Number() 把对象的值转换为数字。
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
String() 把对象的值转换为字符串。
unescape() 对由 escape() 编码的字符串进行解码。

3、js闭包

优点:

①封装功能
②防止全局变量污染
③ 延长变量的生命周期,缓存上一次执行的结果
④实现局部变量/函数私有化

缺点:

①浪费内存(尤其是引用了较大的对象)

注意事项:

①因为调用函数会创建闭包,所以要避免嵌套调用/递归调用闭包函数

示例代码1:

下面我们看一下计算总数的这个代码,我们定义了一个全局的变量sum,用于存储累计的结果,如下:

  1. <body>
  2. <script>
  3. var sum = 0;
  4. function add(a){
  5. sum += a;
  6. };
  7. add(1);
  8. add(2);
  9. add(3);
  10. console.log(sum); //sum : 6
  11. </script>
  12. </body>

示例代码2:

上面这样写是可以实现我们想要的效果的,但sum是全局的变量,程序随时可以改变值,这样的设计不够完善,我们有没办法在add函数中定义一个参数来存储累计的结果值呢?答案是可以的,我们可以再看下面的闭包代码:

  1. <body>
  2. <script>
  3. var add = (function(){
  4. var sum = 0;
  5. return function(a){
  6. return sum += a;
  7. }
  8. })();
  9. add(1);
  10. add(2);
  11. console.log(add(3)); //result : 6
  12. </script>
  13. </body>

示例代码3:

关于闭包,我们知道它的缺点是有内存泄露问题,我们看下下面的闭包代码:

  1. <body>
  2. <button id="btn">增加</button>
  3. <script>
  4. var add = (function(a){
  5. var array = [];
  6. return function(){
  7. return array.push(a);
  8. }
  9. })();
  10. var aCount = 0;
  11. var btn = document.getElementById("btn");
  12. btn.onclick = function(){
  13. for(var i=0;i<10000000;i++){
  14. aCount++;
  15. add("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  16. }
  17. console.log(aCount);
  18. };
  19. </script>
  20. </body>

js初始堆内存:
image.png
点击了几次增加按钮之后的js堆内存:
image.png
此时会发现堆内存长时间占用着没有释放。我们对上面的代码改造一下便可以实现堆内存释放了。

  1. <body>
  2. <button id="btn">增加</button>
  3. <script>
  4. function fn1(a){
  5. var array = [];
  6. return function(){
  7. return array.push(a);
  8. }
  9. };
  10. var aCount = 0;
  11. var btn = document.getElementById("btn");
  12. btn.onclick = function(){
  13. var add = fn1();
  14. for(var i=0;i<10000000;i++){
  15. aCount++;
  16. add("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  17. }
  18. console.log(aCount);
  19. add = null;
  20. };
  21. </script>
  22. </body>

此时堆内存在一分钟内便会释放掉:
image.png
狂点增加按钮的话堆内存释放的时间就长点:
image.png