Hello~~偶又来咯,昨天有小可爱说数组有点随意,其实数组的应用的比较广泛,但是并不是很难,主要是不容易都记住,所以兔妞就是给大家将数组进行了一下梳理,总结了一下使用技巧呢~~今天是函数专题呢,也主要为大家揭秘一下闭包~
函数基础
函数定义
a) 函数声明
function myRabbit(a){
return 2*a;
}
b) 函数表达式
var myRabbit = function (a){
return 2*a;
}
c) 构造函数
var myRabbit = new Function ("a", "b", "return a * b");
var rabbit = myRabbit(1, 2);
小贴士
函数提升
提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为。
提升(Hoisting)应用在变量的声明与函数的声明。
不只是变量会提升,函数也会提升,因此函数可以在声明之前使用。
函数参数
函数参数分为显式参数(Parameters)与隐式参数(Arguments)
小贴士
参数规则
JavaScript 函数定义显式参数时没有指定数据类型。
JavaScript 函数对隐式参数没有进行类型检测。
JavaScript 函数对隐式参数的个数没有进行检测。
JavaScript函数有一个叫做arguments的对象,包含调用的参数数组,如下
x = rabbitFamily(1, 2, 5, 2, 4, 8); function ageSum() { var i, sum = 0;
for (i = 0; i < arguments.length; i++) { sum += arguments[i];
} return sum;
}
函数调用
a) 作为函数调用:funcName + ()
function myRabbit(a, b) { return a * b;
}
myRabbit(10, 2);
b) 作为方法调用
var myGirlfriend = { firstName:"Jane",
lastName: "Miller",
fullName: function () { return this.firstName + " " + this.lastName;
}
}
myGirlfriend.fullName();
c) 作为函数方法调用:通过call(), apply()来调用函数,两个方法的第一个参数必须是对象本身。
function myRabbit(a, b) { return a * b;
}
myRabbit = myRabbit.call(myRabbit, 10, 2);
d) 使用构造函数调用:创建一个新的对象,并继承构造函数的属性和方法
function myGirlfriend(arg1, arg2) { this.firstName = arg1;
this.lastName = arg2;
}
var x = new myGirlfriend("Jane","Miller");
x.firstName;
e) 自调用
(function () {
var x = "萌兔it!!";
})();
十分钟了解闭包
终于到这里了,闭包是JS学习中的难点之一,面试的时候也是面试官从来不会放过的一个考点,因为我们在工作过程中,真的会经常面对闭包。
a) 变量作用域
作为闭包的先导知识,兔妞首先在这里现为大家介绍一下JS的变量作用域。变量作用域包括全局变量和局部变量。全局变量是指声明在函数外部的变量,如果在函数内声明没有加var则也是全局变量,而局部变量则是声明在函数内部的变量。
b) 闭包
我们访问变量的时候,从内部向外部逐层访问,对于父级作用域的变量,子作用域全部能够访问,这就是链式作用域。
而我们想从外部作用域访问内部作用域的变量呢,只能通过将内部函数作为返回值返回来获取,而这就是闭包。闭包就是能够读取其他函数内部变量的函数,函数没有被释放,整条作用域链上的局部变量都将得到保留。(说白了就是一个函数套一个,里面的函数作为外面函数的返回值返回)
闭包demo:
function f1(){
var n = 1;
nAdd = function(){
n += 1;
}
function f2(){
console.log(n);
}
return f2;
}
c) 闭包的用途
读取函数内部的变量
让变量的值始终保持在内存中
d) 闭包的特点
闭包会让变量都被保存在内存中,内存消耗很大,可能导致内存泄露。解决方法:在退出函数之前,将不使用的局部变量全部删除。
闭包会在父函数外部,改变父函数内部变量的值。
好了,今天的内容就是这些了,不知道大家有没有理解什么是闭包呢~~喜欢兔妞的文章,就请点击好看让更多人看到吧,么么哒~~