一、函数的定义方式
1、函数声明
function fn1(x, y) {
console.log(x + y);
}
2、函数表达式
var fn2 = function (x, y) {
console.log(arguments[0] + arguments[1]);
}
3、内置的构造函数(了解)
var fn3 = new Function('x', 'y', 'return x+y')
二、函数的调用方式
function result(x) {
console.log(x);
x()
}
result(function () { console.log('我是函数又是参数'); })
// result([10,20])
// var x = 10;
// var x = 'haha'
// var x = false
// var x = [10, 20]
// var x = function () { console.log('我是函数又是参数'); }
1、函数名( )
fn1(1, 2)
fn2(10, 20)
var fn = fn3(1, 2)
console.log(fn);
2、自调用
(function () {
console.log('我是匿名函数');
})()
//我是匿名函数
var demo = function () {
console.log('我是函数表达式');
}()
//我是函数表达式
3、call( ) apply( )
fn1.call(window, 1, 2)
fn1.apply(window, [10, 20])
4、在对象中的函数调用
var obj = {
name: 'obj',
getName: function () {
console.log(this.name);
}
}
obj.getName()
5、在数组中的函数调用
var arr = [
10,
'haha',
true,
null,
undefined,
[],
{
x: 1
},
function () {
console.log(this);
//在数组函数中,this指向当前数组
}
]
console.log(arr[1]);
arr[7]()
在数组函数中,this指向当前数组
6、函数作为参数的调用
function result(x) {
console.log(x);
x()
}
result(function () { console.log('我是函数又是参数'); })
// result([10,20])
// var x = 10;
// var x = 'haha'
// var x = false
// var x = [10, 20]
// var x = function () { console.log('我是函数又是参数'); }
7、函数作为返回值的调用
function result1(x) {
return x
}
result1(function () { console.log('我是函数又是参数'); })()
// var x = 10;
// var x = 'haha'
// var x = false
// var x = [10, 20]
// var x = function () { console.log('我是函数又是参数'); }
三、闭包
全局作用域:在全局声明的变量==>在任何作用域都有效::在浏览器打开时创建,在浏览器关闭时销毁
局部作用域:在局部中声明的变量(函数)==>在当前作用域有效::在函数调用时创建,函数调用完成后销毁
闭包:定义在一个函数内部的函数
闭包的本质:让父函数作用域成为永恒作用域
闭包的作用:
1、可以访问父函数中的变量
2、可以锁住父函数中的变量
闭包的作用:
1、可以访问父函数中的变量
2、可以锁住父函数中的变量