zoukankan      html  css  js  c++  java
  • javascript学习笔记

    五 Function类型

      每个函数都时Function类型的实例。函数也是对象。

      声明函数:

        function func_name () {}       //javascript解析器会在程序执行时率先读取函数声明,使其在执行任何代码之前可用(可访问)  
        var func_name = function(){};  //解析器执行到它所在的代码行,才会被解释执行。

      因此函数名是个变量,保存的是指向函数对象的指针,不会与某个函数绑定,与包含对象指针的其他变量没什么区别。

      1.没有重载

        声明两个同名的函数,第二个会覆盖掉第一个

      2.作为值的函数

        函数名本身就是变量。因此函数体可以当作值来使用。可以当参数进行传递,也可以当其他函数的返回值。

    function callSomeFunction (someFunction, someArgument){
          return someFunction(someArgument);  
    }

          3.函数内部属性

        函数内部有两个特殊的对象:arguments 和 this 

        *arguments对象保存的是所有传入函数内部的参数。

        *arguments.callee。这是一个指针,指向拥有该arguments对象的函数

    复制代码
    function factorial(num) {
        if(num <=1){
           return 1;
        }else{
           return num*arguments.callee(num-1);//递归调用
           //相当于:
           //return num*factorial(num - 1); 
           //这样消除了函数名与内部递归调用函数名的紧密耦合性
        }
    }
    复制代码

                 *this 引用的是函数据以执行的环境的变量对象。

                 *caller 对象属性。此属性保存的是调用当前对象的函数的引用。如果在全局作用域中调用当前函数,值为null

    复制代码
    function outer()
    {
         inner();  
    }
    
    function inner()
    {
         alert(arguments.callee.caller);
    }
    
    outer();//返回outer()函数的源代码
    复制代码

          4.函数属性和方法

        length ---  FunctionObject.length 函数参数的个数。函数没有参数,则返回0

        apply() --- Function.apply(scope[ ,Function.arguments||Array])//传递的参数可以为Arguments对象,也可以为参数数组

        call() ---   Function.call(scope[, argument1,argument2,.......])//所要传递的参数必须一一列举吹来

        这两个函数都是扩展它自身运行时所在的作用域。参数1,这两个函数运行时所在的作用域(一般都为对象);参数2, 传递给这个函数的参数。

    复制代码
    window.color = 'red';
    var o = {'color':'blue'};
    
    function sayColor(){
         alert(color);      
    }
    
    sayColor(); // red
    
    sayColor.call(this) //red
    sayColor.call(window) //red
    sayColor.call(o) //blue
    复制代码

        使用这两个函数的好处是:降低对象与方法之间的耦合性。

  • 相关阅读:
    java中为什么notify()可能会导致死锁,而notifyAll()则不会
    java中wait()和sleep()的区别;notify()和notifyall()区别
    你不知道的Golang盲点汇总【持续更新】
    rsync性能终极优化【Optimize rsync performance】
    基于cephfs搭建高可用分布式存储并mount到本地
    检测代码潜在bug和质量之SonarQube
    玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历
    好用到哭!8个技巧让Vim菜鸟变专家
    Golang fmt Printf 格式化参数手册/详解/说明
    淘宝滑动验证码研究
  • 原文地址:https://www.cnblogs.com/mysic/p/5384169.html
Copyright © 2011-2022 走看看