函数声明:一个函数的定义有几个关键字组成/1.function关键字/2.函数名称/3.()参数/4.{} 执行语句块组成。
函数声明跟函数表达式的区别:
/函数声明是以function关键字开始的 /函数声明一定要有名字 / 函数表达式有名字,也可以没有名字(匿名函数)/
栗子:function fn(){} //函数声明
var fn = function() {} //函数表达式
函数声明里面的函数不会改变全局变量的值/这个变量是一个固定的值
栗子:var a = 1;
function fn(a) {
a = a * 10;
return a;
} console.log(fn(a)) //a = 1; 不会改变全局中的变量a
function fn() {
var b = 1;
b = b * 10;
return b;
} console.log(fn()) // b = 10; 局部中的变量b的值改变
如果传递的参数是一个数组(Array)或者一个自定义对象,修改数组对象中的属性,对全局是起作用,可见。
栗子:function fn(arrList) {
arrList.make = 'just';
}
var mycar = {make: "Honda", model: "Accord", year: 199};
var x, y;
console.log(x = mycar.make); //Honda
fn(mycar);
console.log(y = mycar.make); //jUST
多层嵌套函数,最里面的函数可以访问外面的函数,外面的不能访问里面的
栗子: function A(x) {
function B(y) {
function C(z) {
console.log(x+y+z)
}
C(3);
}
B(2);
}
A(1); // 6,C可以访问B,B属于A,C能访问B / A访问不了B跟C
命名冲突:如果变量命名发生了冲突,则要看他们的作用域,里面的最用域高于外面的作用域。
栗子: function A() {
var x = 10;
function B(x) {
return x;
}
return B;
}
fn = A()(20) //20,因为会采用B作用域中的20赋值
闭包:函数中包含函数的时候,当里面的函数用到了外部函数的变量或者方法,而里面的函数或者引用到的变量被返回 / 执行 / 被外部调用时就产生了闭包。 闭包里面的作用域不会被回收销毁。