文章目录
一:匿名函数的自运行语法
匿名函数的定义:
当某个函数,function 关键字后面没有标识符的时候,那么它就是一个匿名函数(拉姆达函数)
自运行函数的定义:
能够自己运行的一个函数,不用别人调用就能运行的函数
1·1:自运行写法
-
官方推荐的语法
(function(){ consoloe.log("我要自运行"); }())
-
常用的方法
(function(){ consoloe.log("我要自运行"); })();
-
通过关键字实现自运行,【void, !】
void function(){ console.log("void"); }(); ! function(){ console.log("!"); }();
-
带参数的匿名函数
var test = function(str1,str2){ return str1+str2; } window.onload=function(){ alert(test(12,23)); alert(test("hello"," 亲")); }
1·2:匿名函数的常见用法:
- 函数的表达式,(var test = function(){})
- 事件处理函数,(window.onload = funciont(){})
- 自运行函数
- 闭包中嵌套的函数(闭包)
- 作为另一个函数的参数(定时器,迭代函数)
二:函数的闭包
闭包的定义:
- 闭包函数的使用必须使用var关键字声明变量
- 当函数嵌套时,被嵌套的函数就是闭包函数
- 【闭包是指有权访问另一个函数作用域中的变量的函数】
- 【闭包也可以理解为全局变量访问函数内部变量的函数(能够读取其他函数内部变量的函数)】
var f = (function(){
var count = 0;
return function(){
return ++count;
}
}());
console.log(f());
console.log(f());
闭包的使用:
- 通过内嵌子函数,在父函数外部访问父函数的某个局部变量,
- 其实体现的就是块级作用域 let
- 可以读取函数内部的变量, 让这些变量的值始终保持在内存中。
闭包的注意事项:
-
不要频繁的使用闭包,因为闭包会添加内存消耗,可能会造成内存泄露
-
通常程序会有垃圾回收机制,闭包打破了垃圾回收机制
(一般的局部函数会在使用完以后被垃圾回收机制回收掉,到时发生闭包的函数没有被垃圾回收处理掉)
闭包实现案例
- 用闭包的方式实现mult(5)(6)(7)
function mult(m){
return function(n){
return function(k){
return m*n*k;
}
}
}
console.log(mult(5)(6)(7));
三:函数对象
3·1:函数的定义有三种方法:
-
函数的声明(会存在变量的提升)
function fun1(){//变量的提升 console.log("fun1"); }
-
函数的表达式
let fun2 = function(){ console.log("fun2"); }
-
构造函数的方法
//let fun3 = new Function("[参数列表]","函数体代码"); let fun3 = new Function("a","b","c","console.log(a+b+c);"); fun3(1,2,3);
3·2函数对象的内置对象
this:
函数的内置对象,必须出现在函数体内
- this和事件连用的时候,代表的是触发事件的元素
- this和普通函数连用的时候,代表的是调用该函数的元素
- this和构造函数连用的时候,代表的是New出来的元素
- this和类连用时候,代表的是该类的方法或者属性
arguments:
也是必须出现在函数体内的
代表当前函数接收的所有实参,它是一个伪数组,能像数组一样使用,但不能调用数组的相关的方法
fun([],[],[]);
function fun(){
if(typeof arguments[0] == "number"){
return arguments[0]*arguments[0];
}else{
return "数据不合法";
}
}
console.log(fun(123));
-
arguments.callee:等于函数对象本身,Callee属性是个指针,指向了arguments对象所在的函数
function fun(n){ let c; if(n == 1){ c = 10; }else{ c = arguments.callee(n-1)*n; } return c; } //如果函数名进行修改,函数体不用修改 console.log(fun(10));
四·原型对象
4·1:prototype的定义:
prototype原型对象,通常只和类有关函数对象.prototype
prototype保存着所有实例方法的真正所在,即所有的实例方法都是在prototype中保存着。
prototype指向一个包含所有实例共享的属性和方法的对象
通过同一个构造函数构造出来的的所有实例,都共享同一个prototype
4·2:区分原型的属性和实例的属性
- 实例:用new调用构造函数创建出来的对象叫做实例(例如s和s1)
- 原型属性:写在prototype后面的叫做原型属性 ,prototype
- 实例属性:创建出来的对象,重新给原型属性赋值后,就成为了实例属性。 proto
function Student(newId,newName){
this.id = newId;
this.name = newName;
}
Student.prototype.eat = function(){
console.log(this.id + "eat");
}
Student.prototype.sleep = function(){
console.log("sleep");
}
//原型的属性(所有的实例共享该属性)
Student.prototype.gender = "女";
//方法属于类的,并不属于某一个单独的实例
let s = new Student(1,"老王");
let s1 = new Student(2,"小明");
//实例属性(该对象的个人行为,并不影响原型属性)
s.gender = "男";
//删除自己添加的属性
delete s.gender;
console.log(s.gender,s1.gender);
nt.prototype.gender = "女";
//方法属于类的,并不属于某一个单独的实例
let s = new Student(1,"老王");
let s1 = new Student(2,"小明");
//实例属性(该对象的个人行为,并不影响原型属性)
s.gender = "男";
//删除自己添加的属性
delete s.gender;
console.log(s.gender,s1.gender);