zoukankan      html  css  js  c++  java
  • JS 函数总结

    函数的定义

    (1) 函数的声明:
    function add(x, y) {
    	return x + y;
    }
    
    (2)函数表达式
    var add = function (i, j) {
    	reutrn i + j;
    }
    
    (3)对象实例化(实际编程一般不会用),定义在全局。
    var add = new Function ('i', 'j', "return (i + j)");
    


    函数的属性:
      prototype:add
      constructor:function add(i, j)
      __proto__ : Object, 来自于实例初始化的prototype


    构造函数:
    prototype是函数的专利,只有函数才有prototype属性。
    构造函数与普通函数的区别
    (1)本质上没有什么区别。
    (2)构造函数通常会有this指定实例属性,原型对象上面通常有一些公用方法
    (3)构造函数命名通常第一个字母大写。


    函数的调用
    (1)构造函数调用模式
      var person1 = new Person('hg');
      var person2 = new Person('wj');

    (2)方法调用模式,就是调用对象的方法
      person1.say();

    (3)函数调用模式

    例子(1)
        function aaa() {
            this.a = 1;
            alert(this + "  aaa  " + this.a);
            function bbb() {
                alert(this + "  bbb  " + this.a);
            }
            bbb();
        }
    
    	//这里都可以弹出1. 因为 this.a = 1, 这个this == window。所以a挂在window上面了。
        aaa();		//注意:两个this指向的都是window。
    
    例子(2)
        //获取对象构造函数名称
        function type(obj) {
            return obj && obj.constructor && obj.constructor.toString().match(/functions*([^(]*)/)[1];
        }
    
        function AAA() {
            this.aa = 1;
            alert(this + "  aaa  " + this.aa);
            this.bbb = function () {
                alert(type(this));		//AAA
                alert(this + "  bbb  " + this.aa);
            }
        }
    
    
        var A = new AAA();		//[object Object]  aaa  1
        A.bbb();				//[object Object]  bbb  1
        alert(window.A.aa);		//1
        alert(window.aa);		//undefined
    
    例子(3)
    
        //获取对象构造函数名称
        function type(obj) {
            return obj && obj.constructor && obj.constructor.toString().match(/functions*([^(]*)/)[1];
        }
    
        function AAA() {
            this.aa = 1;
            alert(this + "  aaa  " + this.aa);
            function bbb() {
                alert(type(this));      //Window
                alert(this + "  bbb  " + this.aa);
            }
            bbb();      //[object Window]  bbb  undefined
        }
    
    
        var A = new AAA();  //[object Object]  aaa  1
        // A.bbb(); 无法调用,因为是bbb局部函数,
        alert(window.A.aa);     //1
        alert(window.aa);       //undefined
    

     (4)apply,call调用模式

    Function.prototype.apply;
    apply是函数上面的方法。所有的函数都可以调用这个方法。

    如果获取一个对象类型的函数:
      Object.prototype.toString.apply(obj);

      Object.prototype.toString.apply(1234); //number

    apply是一个借用的功能。

      A.apply(B, args); // B函数-->>借用-->>A函数. 操作参数args。

      call(this, x, y); //call 后面的参数,分开传入,apply传入的是一个数组。

    (5) bind方法!!!
    var test = B.bind(A, argus);
    test();
    bind绑定了对象和参数。返回一个函数,需要的时候,执行就好了。


    二,arguments

    (1) Array-like
    只是长得像数组,但不是数组,可以有arguments[index]
    和arguments.length的方法,但其他数组方式无法使用。

    function test(x, y, z) {
      alert(type(arguments));  //object
      var args = Array.prototype.slice.apply(arguments);
      alert(type(args));     //Array
    }

    test(1,3,4,5,6);
    弹出: 第一个是Object对象,第二个是Array数组。

    用这个把参数给转换为数组,也可以。
    var args = Array.prototype.slice.apply(arguments);


    (2) arguments.callee
    指向函数本身. arguments.callee();调用函数本身。
    进行递归的方式。

    	var hga = 3;
    	function test(a) {
    	    if (a != 0) {
    	        alert(a);
    	        a--;
    	    }
    	    else {
    	        return ;
    	    }
    
    	    arguments.callee(a);
    	}
    	test(hga);
    

    三,递归 

     不用arguments.callee();就要防止,函数名被篡改。

    四,闭包:在函数中定义函数,而被定义的函数,调用了父函数中的变量。

    (function() {
    	var a = 0;
    	function b() {
    		a = 1;
    		debugger;
    	}
    })();
    
    闭包的使用场景:改变作用域,将函数的变量,变为私有变量。
    
    
    

     后期会专门写一篇关于闭包的问题。

    五,First-class function.

       JS的函数,可以作为变量保存,可以作为参数传递,可以作为返回值返回。

    (1)函数颗粒化。
    	比如实现一个add(num1)(num2)(num3);的这种作用链调用的函数。
    一个不定量,累加的。回调。
    
    	function add(value) {
    		
    		var helper =  function (next) {
    			value = typeof(value) === 'undefined' ? value : value + next;
    			return helper;
    		}
    
    		helper.valueOf = function () {
    			return value;
    		}
    		
    		return helper;
    	}
    
    	console.log(add(1)(2)(3));
    
    //实现方式是,首先在函数内定义一个函数,helper,判断传入的参数是否是undefined.
    //如果是,value值就不变,如果不是,就更新value值。
    //函数返回的是一个helper的函数。
    
    (2)回调,做异步回调
    
    在ajax中,在success返回成功时,做function()
    
    //封装了一个ajax的异步调用。
    	function ajax.get(url, callback) {
    
    		var createXHR = function () {
    			var xhr;
    			if (window.XMLHttpRequest) {
    				xhr = new XMLHttpRequest();
    			}
    			else if (window.ActiveXObject) {
    				xhr = new ActiveXObject('Microsoft.XMLHTTP');
    			}
    			return xhr;
    		}
    		var xhr = createXHR();
    		if (xhr) {
    			xhr.open('get', url, true);
    			xhr.onreadystatechange = function () {
    				if (xhr.readyState == 4) {
    					if (xhr.status == 200) {
    						callback.success(xhr);
    					}
    					else {
    						callback.fail(xhr);
    					}
    				}
    			}
    
    			xhr.send(null);
    		}
    
    	}
    
  • 相关阅读:
    VMware Workstation 8.0.0 安装 Red Hat5.3
    Struts2 结合HttpClient 实现远程服务器文件下载
    按位与、或、异或等运算方法
    Java中实例方法、类方法和构造方法
    JAVA中类、实例与Class对象
    Shell学习笔记——循环
    placement new带来的rapidxml.hpp编译错误
    从GitHub下载CocosBuilder2.1的源码
    Visual Studio中,同一个solution内多个project之间的引用
    cocos2dx中让根节点的opacity影响孩子节点
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4855264.html
Copyright © 2011-2022 走看看