函数
声明:function 方法名(传递参数){执行的代码块}
function x(){} //function命令
var x =function(){};// 函数表达式
var x= new function(){} //function构造函数
function命令与函数表达式的区别:
两者的区别:解析器会先读取函数声明,并使其在执行任何代码之前可以访问;而函数表达式则必须等到解析器执行到它所在的代码行才会真正被解释执行。
立即执行函数,
函数多次声明
如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。 JS没有重载。
作用域
作用域指的是变量存在的范围。JS 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。函数外部声明的变量就是全局变量,它可以在函数内部读取。在函数内部定义的变量,外部无法读取,称为局部变量。
声明提前,赋值在后
在进入一个作用域时会把所有声明(var a,function a( ) { } )的放到作用域头部,再按顺序进行赋值。
console.log(x); //undefinded
var x=2
console.log(x) //2
x(); //undefinded
var x=function(){x=3}
x();//3
数值传递方式
按值传递:在函数体内修改参数值,不会影响到函数外部。
按引用传递:传入函数的原始值的地址,因此在函数内部修改参数,将会影响到原始值。
var a=2;
var b=a;//a取a的值的副本;a复制一个给b
a=3;//b的值为2
var p = [1,2,3];
function f(o)
{
console.log (o);//1,2,3
o = [2,3,4];
console.log (o);//2,3,4
}
f(p);
console.log (p); // 1,2,3
var obj={p:1};
var ts=obj;//obj地址副本给了ts
obj=null;
console.log(ts);//{p:1}
obj.p=2;//按引用传递
console.log(ts);//{p:2}
闭包
有权访问另一个函数作用域的变量的函数。
function f1() {
var n = 9;//被保护的变量
function f2() {
console.log(n);
}
return f2;//return出可以操作局部变量的内层函数
}
var result = f1();//必须成为一个全局变量的属性。
result(); // 9
闭包就是一个函数引用另外一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会徒增内存消耗.闭包不当还会引起内存泄漏。