《JS权威指南学习总结--第8章 函数知识》

内容要点:

1.函数表达式定义后立即调用: var tensquared = ( function(x){ return x*x ;}(10) );

2.嵌套函数

      在JS里,函数可以嵌套在其他函数里。例如:

          function hypotenuse(a,b){

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

               return Math.sqrt(square(a)+square(b));     

           }

     嵌套函数的变量作用域规则:它们可以访问嵌套它们(或多重嵌套)的函数的参数的参数和变量。例如,在上面的代码中,内部函数aquare()可以读写外部函数hypotenuse()定义的参数a和b。

3.四种方式来调用JS函数

       作为函数、作为方法、作为构造函数、通过它们的call()和apply()方法间接调用

4.定义并调用一个函数来确定当前脚本运行时是否为严格模式

        var strict = ( function(){ return !this }());

5.方法调用和函数调用的一个重要的区别

     即:调用上下文。

     属性访问表达式由两部分组成:一个对象(o)和属性名称(m)。在像这样的方法调用表达式里,对象o成为调用上下文,函数体可以使用关键字this引用对象。例如:

     var calculator = {      //对象直接量

         operand1:1,

         operand2:1,

         add:function(){

             //注意this关键字的用法,this指代当前对象

            this.result = this.operand1 + this.operand2;

            }

        };

     calculator.add(); //这个方法调用计算1+1结果

     calculator.result  //=> 2

   方法和this关键字是面向对象编程范例的核心。任何函数只要作为方法调用,实际上都会传入一个隐式的实参---这个实参是一个对象,方法调用的母体就是这个对象。

   通常来讲,基于那个对象的方法可以执行多种操作,方法调用的语法已经很清晰地表明了函数将基于一个对象进行操作。

6.方法链

    当方法的返回值是一个对象,这个对象还可以再调用它的方法。这种方法调用序列中(通常称为 "链" 或者 "级联")每次的调用结果都是另外一个表达式的组成部分。比如,基于jQuery库,

    //找到所有的header,取得它们id的映射,转换为数组并它们进行排序

    $(":header").map(function(){ return thsi.id }).get().sort();

   当方法并不需要返回值时,最好直接返回this。

7.this关键字

   this是一个关键字,不是变量,也不是属性名。JS语法不允许给this赋值。

   和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。

   如果嵌套函数作为方法调用,其this的值指向调用它的对象。如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式下)就是undefined(严格模式下)。

   很多人误以为调用函数时this会指向调用外层函数的上下文。如果你想访问这个外部函数的this值,需要将this的值保存在一个变量里,这个变量和内部函数都同在一个作用域内。通常使用变量self来保存this。

   例如:

       var o = {              //对象o

          m : function(){    //对象中的方法m()

              var self = this; //将this的值保存至一个变量中

              console.log( this ===0 );  //输出true,,this就是这个对象o

              f();  //调用辅助函数f()

              function f(){                       //定义一个嵌套函数f()

                 console.log(this === 0);   // "false":this的值是全局对象或undefined

                 console.log(self === 0);   // "true":self指外部函数的this值

                      }

                  }

             };

8.构造函数的调用

   如果构造函数没有形参,JS构造函数调用的语法是允许省略实参列表和圆括号的。凡是没有形参的构造函数调用都可以省略圆括号。比如,下面这两行代码就是等价的:

   var o = new Object();

   var o = new Object;

9."||"运算符

    if(a ===undefined ) a = []; //如果未定义,则使用新数组

    相等于 a = a || [];

    需要注意的是,使用 "||"运算符代替if语句的前提是a必须预先声明,否则a=a||[]会报引用错误,在这个例子中a是作为形参传入的,相当于var a,即已经声明了a,所以这样用是没有问题的。

原文地址:https://www.cnblogs.com/hanxuming/p/5810490.html