JavaScript高级程序设计(第3版)第七章读书笔记

第七章 函数表达式javascript

1. 函数声明有一个重要特征 ,函数声明提高。即在执行代码以前会先读取函数声明,意味着能够把函数声明放在调用它的语句后面。java

2. 使用arguments.callee实现对函数的递归调用。但在严格模式下,不能经过脚本访问arguments.callee,但可使用命名函数表达式来达成相同的效果。闭包

3. 闭包是指有权访问另外一个函数做用域中的变量的函数。建立闭包的经常使用方式,就是在一个函数内部建立另外一个函数。函数

4. 因为闭包会携带包含它的函数的做用域,所以会比其余函数占更多的内存。慎重使用。this

5. 闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象。spa

6. 在闭包中使用this对象也可能致使一些问题,匿名函数的执行环境具备全局性,所以其this对象一般指向window。code

var name = "The window";

var object = {

         name: "My Object",

         getNameFunc :function(){

                   return this.name;

         }

};

console.log(object.getNameFunc());    // My Object

 

var name = "The window";

var object = {

         name: "My Object",

         getNameFunc :function(){

                   return function(){

                            return this.name;

                   };

         }

};

console.log(object.getNameFunc()());    //The window

  

 

把外部做用域中的this对象保存在一个闭包可以访问到的变量里,就可让闭包访问该对象了。对象

 1 var name = "The window";
 2 
 3 var object = {
 4 
 5          name: "My Object",
 6 
 7          getNameFunc :function(){
 8 
 9                    var that=this;
10 
11                    return function(){
12 
13                             return that.name;
14 
15                    };
16 
17          }
18 
19 };
20 
21 console.log(object.getNameFunc()());   // My Object

 

7. 闭包在IE9以前的版本中会致使一些特殊的问题,若是闭包的做用域链中个保存着一个HTML元素,那么就意味着该元素将没法被销毁。blog

8.模仿块级做用域的匿名函数的语法:递归

(function(){
       //这里是块级做用域

})();

  

以上代码定义并当即调用了一个匿名函数,将函数声明包含在一对圆括号中个,表示它其实是一个函数表达式,而紧随其后的另外一对圆括号会当即调用干这个函数。为建党,能够写成这样:

var someFunction = function(){

   //这里是块级做用域

};

someFunction();

  

注意:函数表达式后面能够接圆括号,可是函数声明后面不可接圆括号,将函数声明嘉善跟一对圆括号便可转换成函数表达式。

9. 模仿块级做用域的作法常常在全局做用域中被用在函数外部,从而限制向全局做用域中添加过多的变量和函数。这种作法能够减小闭包占用的内存问题,由于没有直线搞匿名函数的引用,只要函数执行完毕,就能够当即销毁其做用域链了。

10. 任何在函数中定义的变量,均可以认为是私有变量,由于不能在函数的外部访问这些变量。

11. 有权访问私有变量和私有函数的公有方法称为特权方法。第一种是在构造函数中定义特权方法。特权方法做为闭包有权访问在构造函数中定义的全部变量和函数。

    静态私有变量,经过在私有做用域中定义私有变量或函数,建立特权方法。这个模式在定义构造函数时并无使用函数声明,而是使用了函数表达式。

相关文章
相关标签/搜索