首页 > 编程语言 > 详细

JavaScript之函数

时间:2015-03-24 19:31:08      阅读:273      评论:0      收藏:0      [点我收藏+]

    

    JavaScript函数同Java方法一样,定义一次,可以被多次调用。JavaScript函数是参数化的:函数的定义会包括一个称为形参的标示符列表,这些参数在函数体中就像局部变量一样工作。函数调用会为形参和实参提供实参的值。除了实参之外,每次调用还会拥有另一个值---本次调用的上下文:this对象。

    如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文,也就是该函数的this的值。用于初始化一个新创建的对象的函数称为构造函数。

    在JavaScript里,函数也是对象,程序可以随意的操控它们。比如JavaScript可以把函数赋值给变量,或者作为参数传递给其它函数。因为函数就是对象,所以可以给它们设置属性,甚至调用他们的方法。

    

    创建函数的语法:

function f(){
    
    [return;]			
}
var f = function(){
 
    [return;]
}

    这就创建了一个 方法名为 f 的函数,第一种是函数生命语句,第二种是函数定义表达式,其中的return可有可无,如果没有,则默认返回undefined。


    函数的定义位置没有任何限制,可以在代码中的任何位置,可以定义在调用这个函数的地方后面。


    另外,函数中还可以嵌套函数

                function f(arr){
			for( var i=0; i<arr.length; i++){
				if( isNum(arr[i]) ){
					console.log(arr[i]);
				}
			}
			function isNum(n){
				return typeof(n) == "number" ? true:false;
			}
		}
		var arr = ["123",123,456];
		f(arr);

    另外函数名也是一种特殊的变量,存储的是函数类型的数据,只是他不属于JavaScript的基本数据类型,也不可以和其他数据类型进行类型转换。

                 function f(arr){
			for( var i=0; i<arr.length; i++){
				if( isNum(arr[i]) ){
					console.log(arr[i]);
				}
			}
			function isNum(n){
				return typeof(n) == "number" ? true:false;
			}
		}
		var arr = ["123",123,456];
		var a = f;
		a(arr);

    另外function的名字也可以省略,则是匿名函数,

    var max = function(a,b){
         if(a>b){
            return a;
         }else{
            return b;
         }
      }
      alert(max(10,20));


    一、函数的调用

        构成函数的JavaScript代码在定义时并不会执行,只有调用该函数的时候,他们才会执行,有4种方式老调用JavaScript函数。

        1、作为函数调用

        2、作为方法调用

        3、作为构造函数调用

        4、通过他们的 call() 和 apply() 方法进行间接调用


    ①、作为函数调用

        对于普通函数而言,函数的返回值称为调用表达式的值,如果该函数返回是因为解释器到达结尾,则返回undefined,如果函数返回是因为解释器,执行一条return语句而返回,则返回值就是return语句后面的表达式的值,如果表达式没有值,则返回undefined。

    函数调用的上下文在非严格模式下是全局对象,在严格模式下是undefined。可以是用this关键字,来判断当前模式。可以使用“use strict”,来把JavaScript切换到严格模式。

                function f(){
			if( this ){
				alert("这是非严格模式");
			} else {
				alert("这是严格模式");
			}
		}
		f();



    ②、作为方法调用

        一个方法无非就是保存在一个对象的属性里的JavaScript函数,如果有一个函数 f 和一个对象 o ,则可以用下面的代码给 o 定义个名为 m() 的方法。

    o.m = f;

调用时这样调用 : o.m(); //等价于 f();

也可以使用  o["m"]();

    对方法调用的参数和返回值,与普通函数调用一样,但是,方法调用和函数调用有一个重要的区别就是:调用的上下文不同。

    方法调用时,谁调用的这个方法,谁就是上下文,比如 o.m(); 这时候 对象o 就是上下文,函数体可以使用this来引用改对象。

    和变量不同,关键字this没有作用域限制,嵌套函数不会从调用他的函数中集成this。如果嵌套函数作为方法调用,this指向调用它的对象;如果嵌套函数作为函数调用,其this值,不是全局对象(非严格模式下)就是undefined(严格模式下)。很多人误认为,调用嵌套函数时,this会指向调用外层函数的上下文。如果你想访问这个外部函数的this值,需要讲这个this值保存在一个变量里,这个变量和内部函数同在一个作用域内。

        var o = {
           m:function(){
              var self = this;
              alert(this  === o);
              f();
              function f(){
                  alert(this === o);
                  alert(self === o);
              }
           }
       }
       o.m();



    二、传递参数

        JavaScript中的函数定义,并未指定函数形参的类型,函数调用也未对传入的实参值做任何类型的检查,实际上,JavaScript函数调用甚至不检查传入参数的个数。形参不需要加上var,否则就会报错。

function f( a, b ){}

    

        1、可选形参

            当调用函数的时候,传入参数的个数比声明函数时指定的形参的个数要少,则剩下的形参全部设置为 undefined。

                function aaaa(a,b,c,d){
			console.log(a);
			console.log(b);
			console.log(c);
			console.log(d);
		}
		aaaa(1,2);
打印结果:
1
2
undefined
undefined


        2、可变长的实参列表:实参对象(arguments)

            当调用函数的时候传入的实参个数,超过函数定义是的形参的个数,没办法直接获得未命名值得引用,参数对象解决了这个问题,在函数体内,标示符arguments是指向实参对象的引用,可以通过数字下标访问传入参数的实参值。

		function fff(a,b){
			for( var i=0; i<arguments.length; i++ ){
				console.log(arguments[i]);
			}
		}
		fff(1,2,3,4,5,6);


        3、arguments的 callee 属性

            callee属性代指当前正在执行的函数

		function fff(num){
			if( num == 1 ){
				return 1;
			} else {
				return num * arguments.callee(num-1);
			}
		}
		console.log(fff(5)); /// 120

        

        4、函数的特殊用法

            ( function(){ }() )

            这样函数会立即调用,不用人工调用。

            function 之前的圆括号是必须的,因为如果没有这个左圆括号,JavaScript解释器会试图将关键字function解析为函数声明语句,使用圆括号,JavaScript解释器才会正确的将其解析为函数定义表达式。

        

        5、函数的属性和方法

            在JavaScript程序中,函数是值,对函数执行typeof运算符,会返回字符串”function“,但是函数是JavaScript中特殊对象,因函数是对象,他们也可以拥有属性和方法,就像普通对象那样,可以拥有属性和方法。

    ①、length属性

        在函数体中,arguments.length 表示传入函数的实参个数,而length属性代表函数参数的个数,也就是函数在定义时的参数的个数。

                function fff(a,b,c){
			console.log(arguments.length == arguments.callee.length);
			console.log(fff.length); //这个函数的长度就是形参的个数。
		}
		fff(1,2,3,4);


    ②、prototype属性

        每一个函数都包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称为
”原型对象“,每个函数都包含不同的原型对象,当将函数用来做构造函数的时候,新创建的对象会从原型对象上继承属性。

    ③、call()方法和apply()方法

        可以将call()方法和apply()方法看做是某个对象的方法,通过调用方法的形式来间接调用函数。call和apply第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用,要想以对象o的方法来调用函数 f() ,可以这样使用。

                function fff(a,b){
			return this.x + this.y + a + b;
		}
		var o = {
			x:3,
			y:5
		}
		console.log(fff.call(o,1,1));

如果是用apply来调用的话,它的实参要放入一个数组中,如下:

		function fff(a,b){
			return this.x + this.y + a + b;
		}
		var o = {
			x:3,
			y:5
		}
		console.log(fff.apply(o,[1,1]));

这是两者的区别。


        5、内部函数

            ①、使用eval执行JavaScript代码。

        var a = 1;
        alert("a");
        alert(eval("a"));
        eval("alert(a)");

         eval() 只有一个参数,如果传入的参数不是字符串,他直接返回这个参数,如果传入的参数是字符串,它会把字符串作为 JavaScript 代码进行编译,如果编译失败,则抛出一个语法错误异常,如果编译成功,则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值,如果最后一个表达式或语句没有值,则返回undefined。


            ②、使用 parseInt和parseFloat将字符串转化为数字。

            parseInt(String, [radix]);

            radix是可选的,表示进制,默认是十进制。        

       alert(parseInt("5"));
       alert(parseInt("1.13"));
       alert(parseInt("0x10"));
       alert(parseInt("100",8));
       alert(parseInt("32 and 19"));
       alert(parseInt("hello 1"));
       alert(parseInt("two"));

            

           ③、encodeURL和decodeURL对URL进行编码解码

var s = "你好中国!";
console.log(encodeURI(s));  // %E4%BD%A0%E5%A5%BD%E4%B8%AD%E5%9B%BD!
var s = " %E4%BD%A0%E5%A5%BD%E4%B8%AD%E5%9B%BD!";
console.log(decodeURI(s));  //你好中国!

                

            ④ 、isNaN 判断是否不是数字

            isfinite 判断是否是无穷大或者无穷小

console.log(isNaN(3));     //false
console.log(isFinite(23/3));  //true


            ⑤、setTimeout()方法用来实现一个函数在指定的时间之后执行,它返回一个值,这个值可以传递给clearTimeout()用来取消这个函数的执行。           

                   var bcd = setTimeout(function(){ alert(2);},5000);
                   function(){
                            clearTimeout(bcd);
                   }

           ⑥、 setInterval() 用来实现在指定的毫秒数的间隔内重复调用,也返回一个值,这个值可以传递给clearInterval() 函数来取消函数的调用。

       var i = 0;
       function invoke(){
           document.getElementById("div1").innerHTML=i++;
       }
       var clear = setInterval(invoke,1000); 
       function cancel(){
           clearInterval(clear);
       }








    

本文出自 “专注Java,linux技术” 博客,转载请与作者联系!

JavaScript之函数

原文:http://wuqinglong.blog.51cto.com/9087037/1623861

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!