1.函数声明
方式:
1.function关键字
function add(a, b) {return a + b}
2.函数表达式 匿名函数赋值给变量
var sum = function (a, b) {console.log(a+b);}
特点:
1.函数体执行到return结束 没写return 执行到}结束 return 后面不写代码
2.函数内部不写返回值 返回undefined
3.一般情况下 写在return后的代码不生效 变量提升除外
2.函数提升
函数会提升到当前作用域得最顶部 var声明变量会提升到当前作用域顶部
3.函数的内部属性
1.arguments 属性 专门用来保存实际参数列表的类数组对象
arguments内部属性 callee 仅当相关函数正在执行时才可用。 可以用来实现递归实现
将类数组对象转为数组对象
1.Array.from() 将类数组对象转为数组
console.log(Array.from(arguments));
2.使用拓展运算符
console.log([...arguments]);
2.this属性
1.this 是函数赖以执行的环境对象
1.关注this被谁拥有
2.关注拥有this方法被谁调用 this就指向谁
2.this指向:
1.单独使用this this在nodejs指向当前模块{} 在浏览器指向全局对象window
2.函数内部使用this this指向全局对象 global window
3.方法中使用this this指向拥有该方法的调用者
4.事件中使用this this指向接收事件的元素
5.显示函数绑定时,可以更改this指向
3.修改this指向
1.call(执行环境对象,实参列表)
obj1.sayName.call(obj,1,2);
2.apply(执行环境对象,[实参列表])
obj1.sayName.apply(obj,[1,2]);
3.bind(执行环境对象,实际参数)(实际参数)
console.log(obj1.sayName.bind(obj,1,2));
4.立即执行函数 函数声明时也同时就立即执行
特点:
1.页面加载的时候会立即执行一次
2、拥有局部作用域,变量不会泄露
声明形式
1.立即执行函数 (匿名函数(){形参})(实参)
(function (a,b) {console.log('我是立即执行函数',a,b);})(1, 2)
2.var res = ((function (a) {console.log('我是立即执行函数2', a)})('hello'))
5.作用域
块级作用域 if(){} for(){}
函数内作用域 (局部作用域) 函数内部得变量函数外部是无法获取 不适用var声明得变量也是全局变量 a = 10;
函数外得作用域 (全局作用域) 函数内部可以获取函数外部得变量
var a = 1;
function foo(){
var a;
console.log(a,'第二次');// undeifned
a = 2;
console.log(a,'第三次');//2
var a = 3;
console.log(a,'第四次')//3
}
console.log(a,'第一次');//第一行代码 1
foo();
console.log(a,'第五次');//1
6.作用域链
作用域链:自由变量沿着作用域追层向上寻找的过程构成了作用域链
自由变量:当前作用域中本身没有这个变量,但是想要获取到该变量对应的值
var a = 10;
function foo(){
var b = 20;
function fn(){
var c = 30;
console.log(a); //自由变量
console.log(b); //自由变量
console.log(c);
console.log(d);
}
fn()
}
foo();
7.函数调用方法
函数调用得方式
1.函数名()
2.call();
3.apply()
4.bind()()
8.函数的应用
1.函数可以作为参数 回调函数 主函数先执行,回调函数再执行
function foo(x,y,callback) {console.log(x, y);callback(3,4)}
function fn(a, b) {console.log(a,b);return a+b}
foo(1, 2, fn)
2.函数作为返回值
function A(){
var a = 10
return fuction(){
a--
console.log(a)
}
}
A()()
9.闭包
闭包:函数内部作用域可以访问函数外部作用域的变量或方法
function foo() {
let a = 10
function fn() {a--;console.log(a);}
return fn;
}
var res = foo()
词法作用域:内部函数需要访问函数外部中的变量或方法
产生条件:
1.嵌套函数
2.函数内部存在对函数外部变量引用
3.变量不会被回收机制回收 缓存变量
优点:
1.不会污染变量 变量会被维持缓存
缺点:
1.造成内存泄漏 造成性能问题