js函数

参考地址:http://blog.csdn.net/hitman9099/article/details/3854171

几种匿名的写法:

(function() {})();最常见到的;

(function(){}());

void function(){}();

+function(){}();

!function(){}();

-function(){}();

 

创建匿名函数,则必须给出一个函数表达式而非函数的显式声明

通过括号或者void告诉编译器,把function(){}当作函数表达式来解释

 

函数的构造语法有这三种:

1、  声明式

2、  表达式

3、  Function()构造函数//定义函数比用传统方式要慢得多

 

Js代码

    function functionName(arg0, arg1, ... argN) { statements }//function语句  

    var function_name = new Function(arg1, arg2, ..., argN, function_body);//Function()构造函数   

    var func = function(arg0, arg1, ... argN) { statements };//函数直接量 

 

示例:

Js代码

 

    function f(x){return x*x};//function语句   

    var f = new Function("x","return x*x;");//Function()构造函数   

    var f = function(x){return x*x;};//函数直接量  

 

如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是 undefined。  

 

ECMAScript中的函数不能重载。可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是后一个函数。

Js代码

    function doAdd(iNum) { Alert(iNum + 100); }  

    function doAdd(iNum) { Alert(iNum + 10); }  

    doAdd(10);//20  

 

*使用arguments对象实现“重载“。

 

 

函数直接量

函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。语法:

Js代码

 

    var func = function(arg0, arg1, ... argN) { statements };//函数直接量 

 

注:函数名可以指定或不指定。它没有真正创建一个名为fact()函数,只是允许函数体用这个名字来引用自身。JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。

 

函数引用

函数名并没有什么实质意义,它不过是用来保存函数的变量名字,可以将这个函数赋给其他变量,它仍然会以相同方式起作用:

Js代码

    function square(x){return x*x;}  

    var a = square;  

    var b = a(5);//b 为25  

 

  * Function()构造函数和函数直接量差别

 

Function()构造函数和函数直接量之间的差别有一点就是:使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被顶级函数来编译,如:

Js代码

 

    var y = "global";  

    function constructFunction() {  

        var y = "local";  

        //Function()构造函数  

        return new Function("return y;");//不使用局部作用域  

    }  

    function constFunction() {  

        var y = "local";  

        //函数直接量  

        var f = function () {  

            return y;//使用局部作用域  

        };  

        return f;  

    }  

    //显示 global,因为Function()构造函数返回的函数并不使用局部作用域  

    alert(constructFunction()());  

    //显示 global,因为函数直接量返回的函数并使用局部作用域  

    alert(constFunction()()); 

 

函数的实际参数:Arguments对象 

在函数代码中,使用特殊对象arguments ,标识符arguments引用Arguments对象。开发者无需明确指出参数名,就能访问它们。例如,在函数sayHi()中,第一个参数是message。用arguments[0]也可以访问这个值,即第一个参数的值(第一个参数位于位置0,第二个参数位于位置1,依此类推)。因此,无需明确命名参数,就可以重写函数:

Js代码

 

    function sayHi() {  

        if (arguments[0] == "bye") {  

            return;  

        }  

        Alert("Hello" + arguments[0]);  

    } 

 

当函数具有命名的参数时,Arguments对象的数组元素是存放函数参数的局部问题的同义词。arguments[]数组和命名了参数不过是引用同一变量的两种不同方法。用参数名改变一个参数的值同时会改变通过arguments[]获得的值,当然通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值。如:

 

Js代码

 

    function f(x) {  

        alert(x);//显示参数的初始值   

        arguments[0] = null;//改变数组元素也会改变x   

        alert(x);//现在显示 null   

    } 

 

Arguments的属性length

arguments还具有length属性,参数的个数可用arguments.length 得到。

与其他程序设计语言不同,ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档,最多能接受25个),而不会引发任何错误。任何遗漏的参数都会以undefined传递给函数,多余25的参数将忽略。用arguments对象判断传递给函数的参数个数,即可模拟函数重载:

Js代码

 

    function doAdd(iNum) {  

        Alert(iNum + 100);  

    }  

    function doAdd(iNum) {  

        Alert(iNum + 10);  

    }  

    doAdd(10);//20  

 

  虽然不如重载那么好,不过已足可避开ECMAScript的这种限制。

 

    Arguments的属性callee

 

Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这对象未命名的函数调用自身非常有用。

Js代码

    var f = function (x) {  

        if (x <= 1) {  

            return 1;  

        }  

        return x * arguments.callee(x - 1);  

    };  

alert(f(3));//6  

 

当然也可以给它临时取个名:

 

var f = function tmpName(x) { if (x <= 1) { return 1; } return x * tmpName(x - 1); }; alert(f(3));//6

 

函数的属性length

因为函数是引用类型,所以它们也有属性和方法。  ECMAScript  定义的函数的属性  length (只读) 声明了函数声明的参数个数,与arguments.length不同,这个length属性在函数体的内部与外部都有效 。例如: 

Js代码

 

    function doAdd(iNum) {  

        alert(iNum + 10);  

    }  

    function sayHi() {  

        alert("Hi");  

    }  

    alert(doAdd.length);//输出: 1   

    alert(sayHi.length);//输出: 0 

 

 

 

无论定义了几个参数, ECMAScript 函数可以接受任意多个参数(最多 25 个)。

 

函数的属性prototype

每个函数都有一个prototye属性,它引用的是预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用。

 

定义函数属性

    //创建并初始化静态变量  

   funtion  person(){}     

   person.age =10 0;  

 

函数的方法apply()和call()对this引用对象(运行空间)强制转换 :

    fun.call(object, arg1, arg2, ...)

    fun.apply(object, [arg1, arg2, ...])

 

   

例如,要找到一个数字数组中的最大数字,可以用apply()方法把数组元素传递给Math.max()函数:

Js代码

 

    var array_of_numbers = [5,7,3,6];  

    var biggest = Math.max.apply(null, array_of_numbers);  

    alert(biggest);//7 

 

函数的方法valueOf()和toString()

Function  对象也有与所有对象共享的标准  valueOf ()  方法和  toString ()  方法。

 

1、js静态化函数,使用的时候不需要初始化。如下:

  var CheckFlash = {

            check: function() {alert(‘check.’);}               

     }

 

使用时直接调用:window.onload = CheckFlash.prompt();

 

2、需要初始化得写法

     var c = function(){};

        c.prototype={

            check: function() {alert('check.'); }

        }

        c.check();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值