webveuje/考试/原题/js/js闭包20210408.md
2021-04-29 17:16:40 +08:00

167 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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