我们都知道,在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的帮助,这即展示了局部函数的独立性,也没有违背局部函数的特性。
好啦,以上是个人对局部函数和函数独立性的理解,如果大家有什么疑问或者有更好的见解,欢迎留言评论,大家一起学习呀。