函数高级应用
1.函数的定义方式
(1)、函数声明
function fn(){
console.log('this is a function')
}
(2)、函数表达式
var fn = function(){
console.log('赋值表达式函数')
}
(3)、内置构造函数的形式
var fn3 = new Function("num1", "num2", "return num1+num2");
console.log(fn3(2, 3));
推荐使用第二种形式,第三种用的相对较少,但也是必须掌握的内容。
2.函数的调用方法
(1)、函数名()
var fn1 = function () {
console.log("函数名()");
}
window.fn1();
fn1();
- 、自调用
var fn2 = (function () {
console.log("自调用");
})();
- 、call()调用
fn1.call();
- 、对象中的函数调用
var obj1 = {
name: "小刚",
say: function () {
console.log(this.name + "喜欢吃辣条!")
}
}
obj1.say();
- 、数组中函数调用
var arr = [
100,
"哈哈",
function () {
console.log(this);
console.log(this[1] + "我是数组中的元素,也是函数");
},
function () {
console.log("66666");
},
true
];
console.log(arr[2]);
arr[2]();//
arr[3]();
- 、函数作为参数的调用
function fn3(x) {
x();
}
fn3(function () { console.log("我是函数也是参数"); });
(7)、函数作为返回值的调用
function fn4() {
return function () { console.log("我是函数也是返回值!") }
}
fn4()();
3.闭包
- 、定义
闭包就是能够读取其他函数内部变量的函数,由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 “定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的用途:
可以在函数外部读取函数内部成员
让函数内成员始终存活在内存中
- 、原理
实际上在js的作用域机制中,有一个作用域是永恒的,就是window全局作用域,只要浏览器窗口不关闭,全局作用域是不会销毁的,这个windows全局作用域就是永恒的,在全局作用域中定一个函数,无论调用几次,这几次调用都可以共享操作同一个全局变量。
然而局部作用域不是啊,它只是在函数调用的时候有效,函数调用完成之后,局部作用域就关闭了,也也就意味着局部变量就失效了。所以我们在全局作用域下获取不到局部变量,再其他的作用域下也获取不到局部变量。
但是闭包不一样啊,可以让它的父函数作用域永恒,像windows全局作用域,一直在内存中存在。这也是闭包的本质。也是咱们上课讲的闭包的第二个作用锁住局部变量。当闭包函数调用时,它会动态开辟出自己的作用域,在它之上的是父函数的永恒作用域,在父函数作用域之上的,是window永恒的全局作用域。闭包函数调用完了,它自己的作用域关闭了,从内存中消失了,但是父函数的永恒作用域和window永恒作用域还一直在内存是打开的。闭包函数再次调用时,还能访问这两个作用域,可能还保存了它上次调用时候产生的数据。 只有当闭包函数的引用被释放了,它的父作用域才会最终关闭(当然父函数可能创建了多个闭包函数, 就需要多个闭包函数全部释放后,父函数作用域才会关闭)。
(3)、闭包之访问函数内部变量
一些关于闭包的例子
案例一:
var name = "this window";