zoukankan      html  css  js  c++  java
  • javascript笔记4-函数表达式

    1. 一般形式的创建函数,在执行代码之前会先读取函数声明,所以可以把函数声明写在函数调用的下面:
       sayHi();
       function sayHi(){
               alert("Hi!");
      }
    2. 使用函数表达式创建函数,调用前必须先赋值:
       sayHi();  //错误!!函数不存在
       var sayHi=function(){
               alert("Hi!");
      }
    3. 递归。
      • 一般递归
        function factorial(num){
                        if (num <= 1){
                            return 1;
                        } else {
                            return num * factorial(num-1);
                        }
                    }
      • arguments.callee指向正在执行的函数的指针,可以用它来实现递归:
        function factorial(num){
                        if (num <= 1){
                            return 1;
                        } else {
                            return num * arguments.callee(num-1);
                        }
                    }
    4. 闭包闭包指一个函数,这个函数可以访问另一个作用域里的变量)。
      • 创建闭包的常见方式:在一个函数内部创建另一个函数。当函数执行时,会创建一个执行环境和相应的作用域链。闭包只能取得包含函数中任何变量的最后一个值:
        function createFunctions(){
                        var result = new Array();
                        
                        for (var i=0; i < 10; i++){
                            result[i] = function(){
                                return i;
                            };
                        }
                        
                        return result;
                    }
                    
                    var funcs = createFunctions();
                    
                    //every function outputs 10
                    for (var i=0; i < funcs.length; i++){
                        document.write(funcs[i]() + "<br />");
                    }

        上面代码输出的全部是10。这是因为:每个funcs函数都保存着createFunctions()这个活动对象(这是一个函数,也是一个对象,也是一个引用类型Function类型),而createFunctions()这个活动对象有一个变量i,所以,每个funcs都将拥有这个变量i,而createFunctions()这个函数在返回结果时,i已经变成10了。所以funcs数组的每个值都是10.

      • 可以像下面这样改造:
        function createFunctions(){
                        var result = new Array();
                        
                        for (var i=0; i < 10; i++){
                            result[i] = function(num){
                                return function(){
                                    return num;
                                };
                            }(i);
                        }
                        
                        return result;
                    }

        在调用每个匿名函数时,将i的当前值给了num,而在匿名函数内部,创建并返回num的闭包。这样,返回数组的每个函数都有自己num变量的一个副本。(这段没有说清,读者自己再揣摩,如果有更好的描述方法,请评论在文章下面,谢谢)

    5. this对象
      • 全局函数中,this就相当于window。
      • 函数被作为某个方法调用时,this相当于那个对象。
      • 每个函数在被调用时,这个函数都会自动获取两个特殊变量:this、arguments。内部函数在搜索这两个变量时,只搜索到活动对象为止。
    6. 模仿块级作用域(私有作用域)
      • 如下:
        function outputNumbers(count){
                        for (var i=0; i < count; i++){
                            alert(i);
                        }
                    
                        alert(i);   //count
                    }
        
                    outputNumbers(5);

        在Java等语言中,for里面的变量i用完就销毁了。而在javascript中,outputNumbers调用时生成活动对象,而这个i是属于这个活动对象的,因此从它被定义开始,就可以在函数内部随处访问它,它在该活动对象内部是共有的。

      • 匿名函数的语法(创建私有作用域):
        (function(){
          //这里是块级作用域
        })();

        函数声明放在圆括号中,表示它是一个表达式,而后面再加个括号就可以立即调用它。

      • 如果临时需要一些变量,那么就可以使用私有作用域:
        function outputNumbers(count){
                    
                        (function () {
                            for (var i=0; i < count; i++){
                                alert(i);
                            }
                        })();
                        
                        alert(i);   //causes an error
                    }

        上面代码中,i就被私有了,在匿名函数(私有域)外部访问i时就会报错,尽管alert依然在活动对象内。

    7. 私有变量
      • 函数的参数、局部变量以及函数内部定义的其他函数都属于该函数的私有变量。比如:
        function add(num1,num2){
            var sum = num1 + num2;
            return sum;  
        }

        有3个私有变量:num1,num2,sum。函数内部可以访问它们,外部就不行了。

      • 特权方法可以访问私有变量:简单说,使用表达式方式给它一个闭包,在闭包内部访问其他函数:
         function Person(name){

        var a=0;
        this.getName = function(){ return name + a; }; this.setName = function (value) { name = value; }; }
        this.getName、this.setName就是表达式方式,在创建Person实例后,只能通过getName或者setName来访问name、a属性。
  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/mesopotamia/p/5185829.html
Copyright © 2011-2022 走看看