zoukankan      html  css  js  c++  java
  • JavaScript高级程序设计(第三版)第七章 函数表达式

    一种是函数声明;另一种是函数表达式。

    函数声明提升:

    say Hi();

    function say Hi(){

      alert("Hi!");

    }      //这个例子不会抛出错误,因为在代码执行之前会先读取函数声明。

    匿名函数:var functionName=function(arg0,arg1,arg2){函数体};

    sayHi();   //错误:函数还不存在

    var sayHi=function(){

      alert("Hi!");

    };


    //不要这样做                                                   //可以这样

    if(condition){                                                var sayHi();

      function sayHi(){             if(condition){

        alert("Hi!");                sayHi=function(){

      }else{                      alert("Hi!");

        alert("Yo!");                };

      }                      }else{

    }                           alert("Yo!");

                              };

                            }

    7.1 递归

                function factorial(num){
                    if (num <= 1){
                        return 1;
                    } else {
                        return num * factorial(num-1);             //return num * arguments.callee(num-1);这是正确的
                    }
                }
    
                var anotherFactorial = factorial;
                factorial = null;
                alert(anotherFactorial(4));  //error!

    7.2 闭包

    闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

    function fn(propertyName){

             return function(object1){

                       var v1 = object1[propertyName]; //访问了外部变量propertyName变量

             }

    }

    7.2.1 闭包与变量

    function createFunctions(){

             var result = [];

             for(var i=0; i<10; i++){

                       result[i] = function(num){

                                return function(){

                                         return num;

                                }

                       }(i);

             }

    }

    var funcs = createFunctions();

    for(var i=0; i<funcs.length; i++){

             document.write(funcs[i] + ‘<br />’); //output 0,1,2,3…9

    }

    7.2.2 this对象

    如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

    function assignHandler(){

             var element = document.getElementById(‘someElement’);

             var id = element.id;

             element.onclick = function(){

                       alert(id);

             };

             element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存

    }

    7.2.3 内存泄漏

    如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

    function assignHandler(){

             var element = document.getElementById(‘someElement’);

             var id = element.id;

             element.onclick = function(){

                       alert(id);

             };

             element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存

    }

  • 相关阅读:
    【转载】Unity 合理安排增量更新(热更新)
    COCOS2D 释放资源的最佳时机
    【转载】利用Unity自带的合图切割功能将合图切割成子图
    用GL画出人物的移动路径
    使用行为树(Behavior Tree)实现游戏AI
    C#学习笔记
    题目:给定一数组 例如:a = [1,2,3,5,2,1] 现用户提供一个数字 请返回用户所提供的数字的所有下标
    算法: 归并排序
    题目:给定两个有序数组,对其进行合并
    数据结构 顺序表实现优先队列 回顾练习
  • 原文地址:https://www.cnblogs.com/fashion1993/p/4025331.html
Copyright © 2011-2022 走看看