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