定义:function isPrime(n){
......
}
Function定义函数的关键字
isPrime是函数的名字,和变量的命名一样,见名思意
n形式参数(形参)
isPrime(12),12就是实际参数。
函数头部,体现的是函数的设计
函数体,体现的是函数的实现过程。
设计比实现更重要。
for(var n=2;n <= 100;n++){
var flag= true;
if(!isJG(n)){
flag = false;
}
}
alert(flag?"成功":"失败")
function isJG(n){
while(n != 1){
if(0 == n%2){
n /=2;
}else{
n =n*3 + 1;
}
returntrue
}
}
案例:验证哥德巴赫猜想
/*所有的大于6的偶数都可以分为两个质数之和
* 假设系统有一个能帮我们去判断大于6的偶数能否分解的函数。
* 设计一下函数
* 功能:判断一个数能否分解成两个素数之和
* 名称:canSplit
* 输入参数:待分解的数。
* */
var flag = true;
for(var i=6;i<=10000;i+=2) {
if(!canSplit(i)){
flag = false;
break;
}
}
alert(flag ? "成功验证":"失败验证");
/*
* 那么如何实现这个函数那,还不是我们能解决的,那就接续分解
* 如果系统能判断素数的函数,那么也简单。
* 设计函数
* 功能:判断一个数是否是素数
* 名称:isPrime
* 输入参数:待判断的数
* 输出结果:TRUE、false;
* */
function canSplit(i){
for(var a=2;a<=i/2;a++){
if(isPrime(a) && isPrime(i-a)){
return true;
}
}
returnfalse;
}
function isPrime(i){
varm = Math.ceil(Math.sqrt(i))
varfound =false;
for(var n =2;n <= m;n++){
if(m%i == 0){
return false;
}
}
returntrue;
}
从案例中可以获得:当一件事大到无法解决时就把它无限分解成自己可以完成的小事情。如果不能解决就一直分解。
输出结果 |
输入参数
|
函数名 |
函数的本质:直观理解就是实现某个独立功能的代码段,或者说它就是一个数据加工的黑箱子。所谓的黑箱子就是只关心外面的,比如说他是干啥的,需要输入什么,可以得到什么结
果,不关心里面是怎么工作的。
忽略实现细节。
参数传递
所谓的参数传递就是将实参的值传递给形参。通过调试开发者工具可以确定形参在被调用之前不存在,当函数被调用时,实参被创建,并且把实参的值给形参。
参数传递有两种方式:值传递和引用传递。
案例
var a = 5;
increase(a);
alert(a)
function increase(x){
x++;
}
</script>
a的值并没有预期的6;还是5,因为形参和实参是两个不同的变量,x和a没有关系。
引用传递:
var a = new Object();
a.value=5;
increase(a)
alert(a.value)
function increase(x){
x.value++;
}
a. value没有在表面显示被修改,但是a.value确实被加1啦,因为x就是a,专业点这就是引用。
常规类型的参数采用的是值传递,比如Number、String、boolean
对象类型采用的是引用类型,Object。
如果希望把参数从函数中带出来,但是函数的返回值只有一个
6.4变量作用域
局部变量:在函数内部定义的变量,这个变量只能在函数内部使用,在全局中不能使用。
冲突处理原则:就近原则。当在函数中定义了一个和全局变量名相同的变量,此时函数中在定义前使用,那么这个变量还是函数中的变量,为underfined,不使用全局变量
局部和全局同时定义了一个相同名字的变量时如何在局部里面访问到全局变量?在局部中给变量一个Window的前缀,可以访问到全局的变量。
在局部中没有用var定义变量被视为全局变量。