闭包和函数对象以及原型对象

一:匿名函数的自运行语法

匿名函数的定义:

当某个函数,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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值