# 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. 闭包可以保护里面的局部变量,使它们不会随着函数的结束而销毁