函数成员
- arguments
- 实参集合
- caller
- 函数的调用者,谁调用就是谁。
- length
- 形参的个数
- name
- 函数的名称只读不可以修改。
function fn(x, y, z) {
console.log(fn.length) // 3 形参的个数
console.log(arguments) // [3,2,1] 是一个伪数组 实参参数集合
console.log(fn.caller) // window 函数的调用者
console.log(fn.name) // fn 函数名
}
fn(3, 2, 1);
函数进阶
- 函数可以作为参数
- 函数可以作为返回值
作为参数如下例:
function eat (callback) {
setTimeout(function () {
console.log('afternoon');
callback()
}, 1000)
}
eat(function () {
console.log('morning');
})
作为返回值如下例:
function genFun (type) {
return function (obj) {
return Object.prototype.toString.call(obj) === type
}
}
var isArray = genFun('[object Array]')
var isObject = genFun('[object Object]')
console.log(isArray([])) // => true
console.log(isArray({})) // => true
函数闭包
- 闭包的模式分为:函数模式的闭包和对象模式的闭包
- 闭包的作用;缓存数据,持久化数据、、
- 闭包的缓存数据即是优点又是缺点。
- 函数模式的闭包就是两个相互嵌套的函数,里面的函数可以访问外层函数声明的变量,内部函数没有这个变量沿着作用域找到了外部函数的这个变量。
闭包的用途:
- 可以在函数外部读取函数内部成员
- 让函数内成员始终存活在内存中
function fn () {
var count = 0
return {
getCount: function () {
console.log(count)
},
setCount: function () {
count++
}
}
}var fns = fn()
fns.getCount() // => 0
fns.setCount()
fns.getCount() // => 1
作用域、作用域链、预解析
- 全局作用域
- 函数作用域
没有块级作用域
{
var foo = ‘bar’
}console.log(foo)
if (true) {
var a = 123
}
console.log(a)
作用域链示例代码:
var a = 10
function fn () {
var b = 20
function fn1 () {
var c = 30
console.log(a + b + c)
}
function fn2 () {
var d = 40
console.log(c + d)
}
fn1()
fn2()
}
- 内层作用域可以访问外层作用域,反之不行