函数只是一个可以执行的值
比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回
length属性
返回定义函数时,参数的个数
function fn(a,b,c){}
fn.length //3
作用域
Javascript只有两种作用域:一种是全局作用域,另一种是函数作用域
1.函数外部声明的变量就是全局变量(global variable),变量可以在函数外部读取,也可以在函数内部读取
2.在函数内部声明的变量,变量只在函数内部存在。外部无法读取,称为“局部变量”(localvariable)。
3.函数内部定义的变量,会在该作用域内覆盖同名全局变量。
4.如果函数是在全局作用域声明的,执行时只取全局变量的值,不会取局部变量的值。如果是在局部作用域声明的,执行时优先取声明时局部作用域的值
参数
1.length属性返回定义函数时,参数的个数
2.arguments对象包含了函数运行时的所有参数,该对象可以读写参数值
3.函数参数如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递(passes by value)。这意味着,在函数体内修改参数值,不会影响到函数外部。
4.但是,如果函数参数是复合类型的值(数组、对象、其他函数),传递方式是传址传递(pass by reference)。也就是说,传入函数的原始值的地址,因此在函数内部修改参数,将会影响到原始值。
var p = 2;
function f(p) {
p = 3;
}
f(p);
console.log(p) // 2
以上可以这么看:
// 相当于函数内部执行:
var p= arguments[0]//2,
p=3
所以函数内部的p改变,不会影响函数外部的p
闭包
闭包的用处
1.可以读取函数内部的变量
2.让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
3.封装对象的私有属性和私有方法
4.闭包就是将函数内部和函数外部连接起来的一座桥梁。
function Person(name) {
var _age;
function setAge(n) {
_age = n;
}
function getAge() {
return _age;
}
return {
name: name,
getAge: getAge,
setAge: setAge
};
}
var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25
立即执行函数
(function(a){
console.log(a)
}(100));
// 100
可以看作同下面一样:
function fn(a){
console.log(a)
} //先声明
fn(100) //再调用