JavaScript基础一

1,函数

  1.1 函数定义

              所谓函数,本质上是一种代码的分组形式。我们可以通过这种形式赋予某组代码一个名字,便于日后重用时调用。一般来说,函数声明通常由以下几个部分组成:

            · function子句

            · 函数名称

            · 函数所需的参数,参数之间用逗号分隔

            · 函数所要执行的代码块,函数体

            · return子句。函数通常都会有返回值,如果某个函数没有显式的返回值,默认它的返回值是undefined

            · 一个函数只能有一个返回值。当需要同时返回多个值,可以考虑将其放入一个数组中,以数组形式返回

 

1.2 参数(形参与实参)

             · 形参:出现在函数定义文法中的参数列表是函数的形式参数

             · 实参:函数调用时实际传入的参数是函数的实际参数

             一般情况下,形参与实参的个数是相同。但在JavaScript中并不强求这一点,在特殊情况下,函数的形参和实参的个数可以不同。这种情况下使用Argument对象。

 

1.3 JavaScript定义函数的三种方式

              ·普通方式

                                 语法: function 函数名(参数){函数体}

                                 例: function add(a,b){

                                                    return a+b;

                                             }

                                           alert(add(3,4));

                 ·构造函数方式

                                语法:var 变量名 = new Function(参数,函数体);

                                 例: var add =  new Function (‘a’,'b’,'return a+b;’);

                                          alert (add(2,4));

                ·直接定义函数

                                语法: var 变量名 = function(参数){函数体}

                                例: var result = function(a,b){return a+b;}

                                        alert(result(1,2));

    2,JavaScript事件

clip_image002

3,JavaScript提高--面向对象

    3.1函数

         · Arguments对象

                        在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问。

                   -检测参数个数

    function howManyArgs() {

         alert(arguments.length);

    }

    howManyArgs("string", 45);

    howManyArgs();

    howManyArgs(12);

                 -模拟函数重载

   function doAdd() {

       if(arguments.length == 1) {

           alert(arguments[0] + 5);

       } else if(arguments.length == 2) {

           alert(arguments[0] + arguments[1]);

       }

    }

    doAdd(10); //输出 "15"

    doAdd(40, 20); //输出 "60"

           · 变量的作用域

                   - 全局变量与局部变量

var global = 1;

    function f(){

       var local = 2;

       global++;

       return "global = "+global;

    }

    alert(f());       //output  global = 2

    alert(f());       //output  global = 3

    alert(local);     //output  local is undefined

                  -声明局部变量(没有使用局部变量)

    function f(){

           local = 2;

       }

       alert(local);     //output  local is undefined

       f();      

       alert(local);     //output  global = 2

· 在函数f()中定义了一个变量local。在函数没有被调用之前,该值不存在

· local变量会在f()函数首次被调用的创建,并赋予全局作用域

                   -函数域与全局域

var a = 123;

    function f(){

       alert(a);  //output   undefined

       var a = 1;

       alert(a);  //output   1

    }

    f();

· 函数域始终优先于全局域,所以局部变量a会覆盖同名的全局变量(就近原则)

 

3.2函数也是数据

              -匿名函数

                       JavaScript可以将函数作为数据函数使用。作为函数本体,它像普通的数据一样,不一定要有名字。默认名字的函数被称之为“匿名函数”。例如:

function (a){return a;}      

                   匿名函数的两种用法

                        · 可以将匿名函数作为参数传递给其他函数。这样,接收方函数就能利用所传递的函数。

                        · 可以定义某个匿名函数来执行某些一次性任务

              -回调函数

function add(a, b){

       return a() + b();

    }

    var one = function(){return 1;}

    var two = function(){return 2;}

    alert(add(one,two));     //output   3

   

    //可以直接使用匿名函数来替代one()two(),以作为目标函数的参数

  alert(add(function(){return 1;}, function(){return 2;}));

         在这个例子中,函数one和two都是回调函数。

         当将函数A传递给函数B,并由B来执行A时,A就成了一个回调函数(callback function)。如果A还是一个无名函数,就称之为匿名回调函数。

        回调函数的优点:

           · 它可以在不做命名的情况下传递函数(这意味着可以节省全局变量)。

           · 可以将一个函数调用操作委托给另一个函数(这意味着可以节省一些代码编写工作)

           · 回调函数也有助于提升性能

//回调示例

   

    //该函数通过一个循环将其所接收的三个参数分别乘以2,并以数组的形式返回结果

    function two(a, b, c){

       var i, arr = [];

       for(i = 0;i < 3; i++){

           arr[i] = arguments[i] * 2;

       }

       return arr;

    }

   

    //将接收的参数加一后返回

    function addone(a){

       return a + 1;

    }

   

    //测试上面的两个函数

    alert(two(1, 2, 3)); //output   [2, 4, 6]

    alert(addone(100));      //output   101

   

    //将三个数据在两个函数之间传递

    var myarr = [];

    myarr = two(10, 20, 30);

    for(var i = 0; i < 3; i++){

       myarr[i] = addone(myarr[i]);

    }

    alert(myarr);        //output   [21, 41, 61]

   

    /*

     * 以上代码可以工作,但是显然不够优化。

     * 这里使用了两次循环。如果处理的数据量很大火循环操作很复杂的话,开销一定不小。

     */

   

    //优化之后的代码(修改two函数)

    function two(a, b, c, callback){

       var i, arr = [];

       for(i = 0;i < 3; i++){

           arr[i] = callback(arguments[i] * 2);

       }

       return arr;

    }

   

    myarr = two(1, 2, 3, addone);

    alert(myarr);     //output   [3, 5, 7]

   

    //还可以使用匿名函数来替代addone函数

 myarr = two(1, 2, 3, function addone(a){return a + 1;});  

 

         -自调函数

                自调函数--其实就是在定义函数后自行调用。例如

    (

       function(){

           alert("javascript");

       }

    )()

                             · 第一对括号,放置的是一个匿名函数。

                             · 第二对括号的作用,是立即调用

                             · 自调函数只需:将匿名函数的定义放进一对括号中,然后外面再跟一对括号即可。

 

(

       function(name){

           alert("Hello " + name + "!");

       }

    )("javascript")

    //output   Hello javascript!

                              · 第一个括号中的匿名函数接受一个参数

                              · 第二个括号,在调用时,向匿名函数传递参数内容

                  —内部(私有)函数

    function a(param){

       function b(input){

           return input * 2;

       };

       return "The result is " + b(param);

    }

   

    alert(a(2));      //The result is 4

 

                ·当调用全局函数a()时,本地函数b()也会在其内部被调用。由于b()是本地函数,它在a()以外的地方是不可见的,所以将b称之为私有函数。

                · 私有函数的优点:

                  -有助于确保全局名字空间的纯净行(命名冲突的机会很小)

                  -私有性 — — 只将一些必要的函数暴露给“外面”,并保留属于自己的函数,使他们不为该应用程序的其他部分所用。

posted @ 2013-08-26 00:15  潜伏的蛟龙  阅读(257)  评论(0编辑  收藏  举报