本次笔记将要讲述的就是函数与作用域了,其实前面的学习中,我们已经多次使用过了函数,例如alert函数,prompt函数等,这次将具体的学习一下。
函数在我理解是解决问题的一系列动作,调用不同的函数可以解决不同的问题,JavaScript中内置了很多功能强大的函数,例如上面所说的两个函数,当然我们也可以自定义函数,来实现我们的需求。
下面将讲述函数的一般格式:
function functionName(param){
//some code
return ; //如果没有返回值的话可以不写return语句
}
下面将要讲述的是作用域和生命周期的问题。
首先说的是作用域,什么是作用域呢,作用域即指你声明的变量或者函数的使用范围。这里作用域分为两种,一种是全局作用域,一种是函数作用域。全局作用域可以这么理解,在函数外声明的变量,可以用于该页面的所有脚本使用。用一段代码来看的话,就像如下一样:
var num = 10;
function test(){
return ++num;
}
上面声明的num变量即为全局变量,可以被页面中的任意脚本所访问,并且可以改变其值,在通常开发中,我们应该尽量避免声明全局变量和函数,因为很有可能在你不经意之间改变了他们的值。
函数作用域即指变量声明在了函数之中,那么该变量只能在该函数之中所使用,外部是不能访问该变量的。
至于声明周期暂且可以理解为数据存在的周期,比如全局变量,当且仅当程序结束,数据得到释放,而局部变量则当方法执行完后就被释放了,所有要注意一下。
那么问题来了,当全局变量和局部变量同名的时候,程序还能正确执行吗?答案是可以。
JavaScript中有一种标识符查找机制,它总是从当前的作用域内查找你使用的变量,如果当前作用域内没有找到,便会在你上一级的作用域内继续查找,以此内推。但通常应尽量避免这种情况的发生,因为可能会发生一些比较难以发现的错误,比如你是想给全局变量赋值,但最后却是给局部变量赋值。这种错误一般比较难以看出,所以最好是避免声明这种局部变量和全局变量同名的情况。
下面要说的是函数可以被赋值给变量,也可以当做参数传递给方法,下面将举例说明。
function test(){
alert("test");
}
var temp = test;
从上面可以看出,我们将test方法赋值给了temp,但要注意的是这里并没有加(),这表明了此时并没有执行该函数。这个时候想执行test方法的话就有两种方式了,一种是调用test()方法,另一种就是调用temp()方法了
下面将用一个完整的例子来讲述把函数作为参数放入方法中进行传递
<!DOCTYPE html>从上面的例子可以看出,test方法的第一个参数就是另一个方法,这里传递了函数。
<html lang="en">
<head>
<title>just a test</title>
</head>
<body>
<script>
function a(num){
alert(num);
}
function b(num){
alert(num);
}
function test(out,num){
out(num);
}
test(a,11);
test(b,12);
</script>
</body>
</html>