• JavaScript中的函数


      几个要点:
    1. 不能指定传入参数的类型,可以使用typeof进行检测
    2. 参数个数不会被检测,如果传入的参数过多,则多余的参数被忽略;传入过少,则剩余参数设为undefined.
    3. 函数可以嵌套函数,但是只参在函数的最顶层。
    4. 函数直接量:未命名函数。例如:
      Java代码
      1. var f = function(x){return x*x;};  
       或:
      Js代码
      1. var f = function fact(x) { if (x<=1) return 1; return x * fact(x-1);};  
      注意到 fact在外部没法再访问,只是用于实现递归调用。
    5. 可变长度参数列表: Arguments对象在函数内,arguments标识符具有特殊含义,它表示参数列表对象,类似于数组,可以用来获取传入的参数值。例如:
      Js代码
      1. f("aa","bbb","ccc");  
      2. function f(){  
      3.     var length = arguments.length;  
      4.     for(var i = 0;i<length;i++){  
      5.         document.writeln(arguments[i]);  
      6.     }  
      7. }  
       其中如果函数定义了参数,例如f(x,y){};则arguments[0]=x, arguments[1]=y。注:注意如果定义了同名的变量,则arguments会被隐藏。
    6. arguments的另一个属性callee,用来引用当前函数。
    7. 函数可以看作是一种特殊的变量,可以把函数赋值一个变量或属性,而功能不变化。例如:
      Js代码
      1. var o = new Object;  
      2. o.square = function(x) {return x*x;};  
      3. y = o.square(16);  
      4.   
      5. var a = function(x) {return x*x;};  
    8. 作为对象的一个方法时,用this引用当前对象;如果是函数则引用全局对象

    二、函数的属性和方法

    函数的typeof运算结果返回"function",证明函数是一种特殊的数据类型。因此它和对象一样,具有属性和方法。

    1. length属性: 只读属性,返回函数定义中形参个数,与实际传入参数无关;且该属性在函数内外都可使用。例如:

    Js代码
    1. document.write("</br>Outside: "+a.length);  
    2. a();  
    3. function a(a, b, c){  
    4.     document.write("</br>Inside: "+Function.length);  
    5. }  

    2. prototype属性

    3. 自定义函数属性

    因为函数也可以看成一种对象,因此可以给它定义变量,例如:

    Js代码
    1. uniqueIngeger.counter = 0;  
    2.   
    3. function uniqueInteger(){  
    4.   return uniqueInteger.counter++;  
    5. }  
     

    4. apply()和call()方法

    Js代码
    1. f.call(o, 1, 2 );  
     

    相似于:

    Js代码
    1. o.m = f;  
    2. o.m(1, 2);  
    3. delete o.m;  
     

    apply与call相似,只不过传递给函数的参数由数组指定:

    Js代码
    1. f.apply(o, [1, 2]);  

    对象o可以是空,例如: Math.max.apply(null, array_of_numbers);

    三. 函数作用域和闭包

    JavaScript函数是将要执行的代码以及这些代码的作用域构成的一个综合体,在计算机科学术语中,这种代码和作用域的综合体叫做闭包。所有的JavaScript函数都是闭包。

    例如,想编写一个能够通过记住一个值的函数,一种简单的实现是使用函数的变量:

    Java代码
    1. uniqueID = function(){  
    2.       if(!argument.callee.id) argument.callee.id = 0;  
    3.       return argument.callee.id++;  
    4. };  

    每次调用的时候,返回的id值都加1, 但是并不能阻止有人直接对id赋值,例如: uniqueID.id = 0;

    要解决此类问题,可以使用闭包:

    Java代码
    1. uniqueID = (function(){  
    2.         var id = 0;  
    3.         return function() { return id ++;};  
    4. }) ();  

    这里uniqueID引用的是内部返回的函数,并且此函数引用的值是定义有外层函数中,因此不会被uniqueID修改。

    四、Function()构造函数

    可以使用Function构造函数来创建一个函数的例子,例如:

    Java代码
    1. var f = new Function("x", "y", "return x*y;");  
     

    上例创建了一个新的函数,它类似于:

    Java代码
    1. function f(x, y){return x*y;}  
     

    Function构造函数的特点:

    • Function构造函数允许JavaScript代码被动态的创建并且在运行时编译,例如全局的eval()函数
    • Function构造函数解析函数体,并且每次调用的时候都创建一个新的函数对象。
    • 最后,关于Function函数非常重要的一点就是:它所创建的函数并不使用词法作用域,相反,它们总是当作顶层的函数一样来编译。
  • 相关阅读:
    python 初始化Logger
    常用python库
    [转]统计代码行数
    [转]Python模块学习:threading 多线程控制和处理
    [转] GIL 与 Python 线程的纠葛
    [转]Stackoverflow about Python
    清除方式日志收集
    逐行扫描的日志收集LogCollector
    [转]static和final的区别
    [转]Java中的abstract方法和abstract类的问题
  • 原文地址:https://www.cnblogs.com/zsqfightyourway/p/7151788.html
Copyright © 2020-2023  润新知