function函数

  • Post author:
  • Post category:其他


函数的声明

javascript函数实际上是一个对象,每个函数都是Function类型的实例,和其他引用类型一样都具有属性和方法,由于函数时对象,因此函数名是一个指向函数对象的指针,不会与某个函数绑定

– 函数的声明

function 函数名(){
    函数体
}
  • 函数表达式
var box = function(){};

var box = new FunctionI();
第二中声明方法不建议使用,会导致解析两次代码
  • 函数没有重载,后写的函数会把现写的覆盖掉。
  • 在Javascript中函数名本身就是变量,也就是说可以像传递参数那样吧一个函数赋值给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
 //将一个函数作为参数传递给另一个函数
     function add(num1 , num2){
         return num1 + num2;
     }

     function raise(add , num1 , num2){
         return add(num1 , num2)+1;
     }

     alert(raise(add, 10 , 10));//21
  • 使用js内置函数Function创建函数
  • 使用这种方式创建函数也成为动态函数
  • 格式:var a = new Function(“参数列表”,”方法体和 返回值”)
// 函数定义的第三种方式,使用js内置对象创建函数,这宗函数也成为动态函数,但是不常用
        var add = new Function("a,b","var sum;sum = a + b;return sum");
        alert(add(3,3));

return 返回值

  • 任何函数都是不带返回值的,只有当你调用的时候,才会返回返回值。

  • return 的另一个作用,退出当前语句、

匿名函数

  • 格式:
//匿名函数的写法
    function(){//省略函数名
        //方法体
    }
  • 上面的匿名函数不能自我调用
  • 把匿名函数赋值给一个变量,相当于给对象内部创建对象一样
var c = function(){
        方法体
    }; //创建函数不需要加分号,但是这里是赋值给一个变量,是一条语句,所以要加分号
  • 匿名函数的自我调用:

    • 格式: ()(); 两个小括号
    • 第一个小括号写匿名函数
    • 第二个小括号写参数列表
    • 结尾要加分号也可以不加,但是建议加
不传入参数的情况
(function(){
        alert("匿名函数的自我执行");
    })();
传入参数的情况
var a = (function(age){
        return age;
    })(100);

    alert(a);
  • 函数里放一个匿名函数
function a(){
        return function(){
            return "内部匿名函数执行了";
        };
    }

    alert(a()());

闭包

  • 全局变量虽然容易访问,但是正是容易访问会让他变得很危险
  • 使用内部变量的话,又会面临每次调用内部都会初始化的问题
  • 闭包解决了这个问题
  • 通过闭包实现内存驻留,可以方法这个局部变量
//这就是闭包,通过闭包实现内存驻留,同时有不会像全局变量那样
        //放在外边很危险
        function a(){
            var count = 100;
            return function(){
                count++;
                return count;
            };
        }

        var b = a(); //将函数a的引用赋值给b
        alert(b());//101
        alert(b());//102
        alert(b());//103
        alert(b());//104 

==代码分析==

– 上面代码的a函数结果返回给b,这个时候由于他的放回值还在使用变量count,那么就实现了,虽然函数执行了,但是函数内变量没有回收,这样就是内存驻留

– 并且,由于是局部变量,所以外部不能访问,实现了安全的效果

– 继续调用返回的函数,就可以安全的实现累加运算

==注意;==

– javascript 中所有的属性和方法都是公有的,但是可以定义私有变量和私有函数

arguments 对象

javascript函数不会因为 传入的函数参数不一致而报错,可以在函数内部通过arguments对象来获得传入的参数

<script type = "text/javascript">
        var a = box(1,3,5,2,3);
        console.log(a);//控制台输出

        function box(){
            //计算传入数据之和
            var sum = 0;
            for(var i = 0;i <arguments.length; i++){
                sum += arguments[i];
            }
            return sum;
        }

    </script>

所有函数都包含的方法

  • call() 使用当前的函数调用另一个函数
  • apply() 功能和call相同只是传入的参数是个数组
  • 是当前的函数调用另一个函数,
  • 使用函数的call() apply() 替换当前的方法,
  • 格式:要替换的方法名 . call(被替换的方法,参数列表)
//定义一个add 方法
    function add(x, y) {
        return x + y;
    }

    //用call 来调用 add 方法
    function myAddCall(x, y) {
        //调用 add 方法 的 call 方法
        return add.call(this, x, y);
    }

    //apply 来调用 add 方法
    function myAddApply(x, y) {
        //调用 add 方法 的 applly 方法
        return add.apply(this, [x, y]);
    }

    console.log(myAddCall(10, 20));    //输出结果30

    console.log(myAddApply(20, 20));  //输出结果40
  • 改变作用域

    1. 因为这个方法是函数的,所以必须线创建一个有返回值来接受返回值的函数
    2. 创建各种情况的变量,全局变量,局部变量,类的属性
    3. 调用函数来访问不同的作用域的变量,
    4. 使用call() 方法匹配要访问的区域,这个值是付给了函数中的this
var name = '小白';

    var obj = {name:'小红'};

    function sayName() {
        return this.name;
    }

    console.log(sayName.call(this));    //输出小白

    console.log(sayName. call(obj));    //输入小红
  • call()和apply()区别

    • 参数不同, apply 传入的是一个参数数组,也就是将多个参数组合成一个参数数组, call 从第二个参数开始依次传入.
    • apply 可以直接将当前函数的arguments对象作为apply的第二个参数传入

js全局函数

  • 全局函数不属于特定的任何有一个对象
  • 可以直接写函数名使用
  • 常用的方法 :

    • eval()执行其中的javascript中的代码
    • isNaN()判断参数是不是一个==非数字==
    • parseInt()解析一个字符串并且 返回一个整数

      这里写图片描述



版权声明:本文为diaosinixiheixiu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。