面试常见问题(一)

 发布 : 2019-02-26  字数统计 : 564 字  阅读时长 : 2 分  分类 : 面试  浏览 :

JavaScript 闭包

闭包 是指有权访问另一个函数作用域中的变量的函数(能够读取其他函数内部变量的函数)。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

一个函数的返回值是另一个函数,而返回的这个函数如果调用了其父函数内部的其它变量,且返回的这个函数在外部被执行,就产生了闭包。

表现形式: 函数外部能调用函数内部定义的变量。

1
2
3
4
5
6
7
8
9
10
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName; //返回的displayName函数就是闭包
}

var myFunc = makeFunc(); //myFunc 是执行 makeFunc 时创建的 displayName 函数实例的引用
myFunc();

注意:

  • 滥用闭包会导致内存泄露,处理方法:在退出函数之前,将不使用的局部变量全部删除。
  • 闭包会在父函数外部,改变父函数内部变量的值。

闭包的用途

1. 封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var person = function() {
var name = "default"; //变量作用域为函数内部,外部无法访问
return {
getName : function() {
return name;
},
setName : function(newName) {
name = newName;
}
}
}();

print(person.name); //直接访问,结果为undefined
print(person.getName());
person.setName("abruzzi");
print(person.getName());

得到结果如下:
undefined
default
abruzzi

2. 实现类和继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Person() {
var name = "default";
return {
getName : function() {
return name;
},
setName : function(newName) {
name = newName;
}
}
};

var Jack = function(){};
Jack.prototype = new Person(); //继承自Person
Jack.prototype.Say = function() { //添加私有方法
alert("Hello,my name is Jack");
};

var j = new Jack();
j.setName("Jack");
alert(j.getName());
j.Say();

JavaScript 继承

  • 构造函数继承
  • 原型链式继承
  • 组合式继承(借用构造函数和原型链继承两种方式)
  • 等等…

参考文档

留下足迹