函数声明和函数表达式
var f = function () {
}
function f() {
}
函数声明和函数表达式的主要区别是,函数声明会被前置,而函数表达式作为变量,会被提升。
下方是js执行时的逻辑
// 前置和变量提升
var f;
function f() {
}
f = function () {
}
一道题考察知识掌握情况
var f = function () {
console.log(1)
}
function f() {
console.log(2)
}
f();
上方代码直接结果为:1
Function函数了解一下,不怎么常用
闭包(不说话,看图就可以)
一道题考察闭包(循环闭包)
var o = [];
for(var i = 0; i < 5; i++){
o[i] = function () {
console.log(i)
}
}
o[3]();
以上代码执行结果为:5
如何改进以上代码,使o[1]=>1; o[2]=>2; ..., 那就是利用闭包咯
var o = [];
for(var i = 0; i < 5; i++){
(function (i) {
o[i] = function () {
console.log(i);
}
})(i);
}
o[3]();
以上代码执行结果为:3
解析:
- 第一种方法中,只有o[3]()执行时,才会用i,而i却一直在变化,等到o[3]()执行时,i已经是5了;
- 第二种方法,运用了闭包,因为o[i]函数的上一层是自执行函数,因此所运用到的闭包参数i,在for循环过程中就已经固定,不再变化。等到o[3]执行时,固定的闭包参数就被释放了出来
- 被面试的时候被问到这道题,问我除了闭包有没有其它方法,没答出来,原来将var改成let就可以了,竟然不知道
var o = [];
for(let i = 0; i < 5; i++){
o[i] = function () {
console.log(i)
}
}
闭包第二种应用场景(封装变量)
(function () {
var name = 'LHX';
var age = 30;
var export = {};
export.getName = function () {
return name;
}
export.setName = function (newName) {
name = newName;
}
window.export = export;
})();
只有通过释放出来的export才能访问私有变量
闭包的缺陷
闭包中的变量因为可能还会被内部函数用到,因此所占内存一直不能被释放,导致内存浪费
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。