javascript函数、匿名函数、闭包的知识

最近回顾了一下javascript的相关知识,借鉴很多资料,加上自己的理解。把学习心得整理下:

一、javascript函数的声明大概有三种方法:

1、最常规的写法:我这里给个例子

//1、最常见函数写法
function general(){
	alert('hello javascript!');
}
2、匿名函数的写法:

//2、匿名函数的写法
var anonymity = function(){
	alert('hello javascript!');
}
3、构造函数的写法:

//声明一个构造函数
function cf(name,value)
{
	this.name = name;
	this.value = value;
}

var msg = new cf("zyujie","java");

alert(msg.name);

4、关于第2种写法,匿名函数的写法,我们又有三种写法:这里同样以举例说明

//立即执行的匿名函数,三种写法
(function(){alert(1);})();
	
void function(){alert(2)}();
	
!function(){return true;}();

//首先说说第一种:(function(){alert(1);})();

var anonymity = function(){
	alert('hello javascript!');
}

anonymity(); //这样就调用了

//演变调用方法==(anonymity)();==把anonymity替换成函数==(function(){alert('hello javascript!');});==就类似于第一种的写法了!

//第二种:void function(){alert(2)}();
//这种就是无返回值的调用。

//第三种:!function(){return true;}();
//这种前面加了一个运算符“!”,就是这个返回值会取非,我们这样写:
var flag = !function(){return true;}();
alert(flag); //结果是false

二、下面回顾一下闭包

javascript的变量有两种作用域:全局和局部。所有函数的内部都能读取到全局变量,而局部变量则只供函数内部使用。

怎么样从外部读取函数内部声明的变量,我们就通过了闭包去解决了这个问题:

一个简单的闭包例子:

//闭包的小例子,b嵌套在a,a则返回b,这样就我们就可以在外面得到函数内部的变量值了
function a() { 
	var i = 0; 
	function b() { alert(++i); } 
	return b;
}
//调用方法,把声明一个变量c,去作为a()函数的引用,c引用了函数a()后,再调返回方法c()
var c = a();
c();
//我们也可以这样写
a()(); //调用函数a(),和返回方法a()();
alert(c.i); //这样得到的结果是undefined,因为我们只能通过返回的方法去得到函数的内部变量,这样是不行的。
下面有一个经常都会用到的闭包的写法:

function personG(){
    var name = "default";//变量作用域为函数内部,外部无法访问
    return {
       getName : function(){
           return name;
       },
       setName : function(newName){
           name = newName;
       }
    }
}
alert(personG().getName()); //返回default

//但是我个人觉得,我们用匿名函数的写法去写最好:
var personA = function(){
    var name = "default";//变量作用域为函数内部,外部无法访问
    return {
       getName : function(){
           return name;
       },
       setName : function(newName){
           name = newName;
       }
    }
}();
alert(personA.getName());

personG和personA的区别:因为匿名函数是先定义后调用,而常规函数是可以先调用的。
personG().setName("zyujie");
alert(personG().getName()); //返回default
    
personA.setName("zyujie");
alert(personA.getName()); //返回zyujie

//下面写一个时间暂停10秒钟,调用getName的方法,
setTimeout(function(){alert(personA.getName());},10000); //结果还是zyujie,

闭包的一个是前面提到的实例读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

所以在使用过程中,要注意不要乱用闭包,否则会导致内存消耗太大。

就写到这里吧,自己的理解有错误的地方,欢迎大家指正哈。希望和大家共同进步!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值