# js闭包
## 填空
1. 下面代码的执行结果为      
   答案 -1
   
   ```
   function createComparisonFunction(propertyName) { 
    
        return function(object1, object2){ 
            var value1 = object1[propertyName]; 
            var value2 = object2[propertyName]; 
        
            if (value1 < value2){ 
                return -1; 
            } else if (value1 > value2){ 
                return 1; 
            } else { 
                return 0; 
            } 
        }; 
    } 

    let res=createComparisonFunction("num")({num:3,pri:8},{num:6,pri:12})
    console.log(res)

2. 下面代码的执行结果为
答案  10   10
```
function createFunctions(){ 
    var result = new Array(); 
    for (var i=0; i < 10; i++){ 
        result[i] = function(){ 
            return i; 
        }; 
    } 
    return result; 
}

let res=createFunctions()
res[9]()
res[3]()

```


3. 下面代码的执行结果为
答案 9， 3
```
function createFunctions(){ 
    var result = new Array(); 
        for (var i=0; i < 10; i++){ 
            result[i] = function(num){ 
                return function(){ 
                console.log(num)
            }; 
            }(i);
        } 
    return result; 
}
var res=createFunctions()
console.log(res[9]())
console.log(res[3]())

```

4. 下面代码的执行结果为
答案为 The Window

```

var name = "The Window"; 
var object = { 
 name : "My Object", 
 getNameFunc : function(){ 
 return function(){ 
 return this.name; 
 }; 
 } 
}; 
alert(object.getNameFunc()());

```


5. 下面代码的执行结果为
答案为  My Object

```

var name = "The Window"; 
var object = { 
    name : "My Object", 
    getNameFunc : function(){
    var that = this; 
    return function(){ 
            return that.name; 
        }; 
    } 
}; 
alert(object.getNameFunc()()); 

```

6. 下面代码的执行结果为
答案  My Object  My Object  The Window
```
var name = "The Window"; 
var object = { 
    name : "My Object", 
    getName: function(){ 
        return this.name; 
    } 
};
object.getName(); //"My Object" 
(object.getName)(); //"My Object" 
(object.getName = object.getName)(); //"The Window"，

```
解析
    第一行代码跟平常一样调用了 object.getName()，返回的是"My Object"，因为 this.name
就是 object.name。第二行代码在调用这个方法前先给它加上了括号。虽然加上括号之后，就好像只
是在引用一个函数，但 this 的值得到了维持，因为 object.getName 和(object.getName)的定义
是相同的。第三行代码先执行了一条赋值语句，然后再调用赋值后的结果。因为这个赋值表达式的值是
函数本身，所以 this 的值不能得到维持，结果就返回了"The Window


当然，你不大可能会像第二行和第三行代码一样调用这个方法。不过，这个例子有助于说明即使是
语法的细微变化，都有可能意外改变 this 的值。


7. 下面代码的执行结果为
答案   7   12
```
function makeAdder() {
    return function(x) {
        return x + y;
    }
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
add5 = null;
add10 = null;


```

8. 下面代码的执行结果为
答案  /Hello Joe

```
function sayHello(name) {
  var text = 'Hello ' + name;
  var say = function() { console.log(text); }
  say();
}
sayHello('Joe')

```

9. 闭包的定义
答案 闭包是指有权访问另一个函数作用域中的变量的函数

10. 闭包的作用
答案  1. 闭包可以访问到局部变量 
     2. 闭包可以保护里面的局部变量，使它们不会随着函数的结束而销毁