JavaScript——局部函数与函数独立性的理解

我们都知道,在JavaScript中,在函数内使用var定义的是局部变量,在函数内没有使用var定义的或者在函数外定义的则是全局变量。如果局部变量和全局变量的变量名字相同,那么局部变量会覆盖全局变量。全局变量只能在函数中访问,而全局变量可以在所有的函数中访问。

其实,除了局部变量,还有一个概念叫做局部函数。

什么叫布局函数呢?它与局部变量类似,其实就是在一个函数中定义的函数。如下面这段代码:

<script type="text/javascript">
	// 定义全局函数
	function outer()
	{
		// 定义第一个局部函数
		function inner1()
		{
			document.write("局部函数11111<br />");
		}
		// 定义第二个局部函数
		function inner2()
		{
			document.write("局部函数22222<br />");  
		}
		document.write("开始测试局部函数...<br />");
		// 在函数中调用第一个局部函数
		inner1();
		// 在函数中调用第二个局部函数
		inner2();
		document.write("结束测试局部函数...<br />");
	}
	document.write("调用outer之前...<br />");
	// 调用全局函数
	outer();
	document.write("调用outer之后...<br />");
</script>

在上面的函数中,outer函数定义了两个局部函数:inner1和inner2,并在outer函数内调用了这两个局部函数。因为这两个函数是在outer内定义的,因此可以在outer内访问它,无法在外部访问他们,也就是说,只有在outer函数内部这两个函数才有效。

那假如将上面的程序修改一下,在outer增加对inner1的调用,会怎么样呢?

<script type="text/javascript">
	//定义全局函数
	function outer()
	{
		//定义第一个局部函数
		function inner1()
		{
			document.write("局部函数11111<br />");
		}
		//定义第二个局部函数
		function inner2()
		{
			document.write("局部函数22222<br />");  
		}
		document.write("开始测试局部函数...<br />");
		//在浏览器中调用第一个局部函数
		inner1();
		//在浏览器中调用第二个局部函数
		inner2();
		document.write("结束测试局部函数...<br />");
	}
	document.write("调用outer之前...<br />");
	//调用全局函数
	outer();
	//在外部函数之外的地方调用局部函数
	inner1();
	document.write("调用outer之后...<br />");
</script>

运行的时候控制台会报错:

到这里大家也就该明白局部函数的特性了:局部函数的作用域是所在的函数,如果在外部调用,那么会出错。

但是,如果有学过函数独立性的伙伴这时候可能会有疑问。

因为在函数独立性中有说道:“当使用内嵌函数定义某个类的方法的时候,该内嵌函数也是独立存在的,而不是作为该类实例的附庸存在,这些内嵌函数也可以被分离出来独立使用。”

这句话中说“内嵌函数可以被分离出来独立使用”,那按它这么说,岂不是和上面的局部函数的定义冲突了吗?局部函数说不能在外部被调用,可这里又说可以被分离出来独立使用,这到底是怎么回事呢?

我们先来看一段代码:

<script type="text/javascript">
	function Person(name)
	{
		this.name = name;
		// 定义一个info方法
		this.info = function()
		{
			alert("我的name是:" + this.name);
		}
	}
	var p = new Person("Searchin");
	// 调用p对象的info方法
	p.info();
	var name = "测试名称";
	// 以window对象作为调用者来调用p对象的info方法
	p.info.call(window);
</script>

程序运行将弹出两个弹框。

 

通过上面的操作我们可以看到,info方法被调用了两次,一次是被p调用,一次则是被window调用。

这里是不是就违背了之前说的局部函数在外部调用无效呢?

其实没有违背。我们来看一下调用语句

 

    p.info();
	var name = "测试名称";
	// 以window对象作为调用者来调用p对象的info方法
	p.info.call(window);

第一个调用是直接p调用类内方法,这个没有问题,重点在第二个调用。

它是通过call方法以window对象作为调用者来调用对象info的方法,这种操作实际上还是在借助p来调用了info方法,换句话说,window想要调用info方法,但是没有办法直接调用,于是它找到info方法的主人,让它作为中间人,帮忙调用,从而达到自己的目的。

所以说,虽然它可以被分离出来独立使用,但还是得借助p的帮助,这即展示了局部函数的独立性,也没有违背局部函数的特性。

好啦,以上是个人对局部函数和函数独立性的理解,如果大家有什么疑问或者有更好的见解,欢迎留言评论,大家一起学习呀。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值