1、函数:
为完成某一个功能的程序指令(语句)的集合,称为函数。
在js中,函数分为:自定义函数、系统函数(经常查看js帮助手册)
③基本语法
function 函数名(参数列表){
//代码…
return 值;//可以选择
}
例如:
<html>
<head>
<scriptlanguage="javascript">
//输入两个数,再输入一个运算符(+_*/),得到结果
varnum1=window.prompt("请输入第一个num");
varnum2=window.prompt("请输入第二个num");
varoperator=window.prompt("请输入运算符");
num1=parseFloat(num1);
num2=parseFloat(num2);
//如何调用函数
document.writeln("res="+jsSuan(num1,num2,operator));
//自定义函数
functionjsSuan(num1,num2,operator){ //特别强调 参数名请不要带var
var res=0;
if(operator=="+"){
res=num1+num2;
}elseif(operator=="-"){
res=num1-num2;
}elseif(operator=="*"){
res=num1*num2;
}else{
res=num1/num2;
}
return res; //返回
}
</script>
</head>
<body></body>
</html>
改进:
把上面的函数单独提出,写到js文件中,然后在需要的地方引入
myfuns.js
function jsSuan(num1,num2,operator){ //特别强调 参数名请不要带var
var res=0;
if(operator=="+"){
res=num1+num2;
}elseif(operator=="-"){
res=num1-num2;
}elseif(operator=="*"){
res=num1*num2;
}else{
res=num1/num2;
}
return res; //返回
}
在如下HTML文件中引入上面js代码:
<html>
<head>
<script language="javascript" src="myfuns.js">
//引入js代码方法
</script>
<script language="javascript">
//输入两个数,再输入一个运算符(+_*/),得到结果
var num1=window.prompt("请输入第一个num");
var num2=window.prompt("请输入第二个num");
var operator=window.prompt("请输入运算符");
num1=parseFloat(num1);
num2=parseFloat(num2);
//外部引用
document.writeln("res="+jsSuan(num1,num2,operator));
</script>
</head>
<body></body>
</html>
2、函数的使用
(1)、系统函数:
如eval()用的很多,它可以把一个字符串当做脚本来执行。在动态脚本的时候用的比较多。
JavaScript eval() 函数
定义和用法
eval() 函数计算 JavaScript字符串,并把它作为脚本代码来执行。
如果参数是一个表达式,eval()函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript语句。
语法
eval(string)
实例
执行JavaScript代码或表达式:
<script>
eval("x=10;y=20;document.write(x*y)");
document.write("<br>" + eval("2+2"));
document.write("<br>" + eval(x+17));
</script>
以上实例输出结果:
200
4
27
对中文进行编码,主要是为了防止乱码。先编码然后再转码。
escape和unescape函数往往配合使用,可以防止乱码的出现
JavaScript escape() 函数
定义和用法
escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
该方法不会对 ASCII字母和数字进行编码,也不会对下面这些 ASCII标点符号进行编码: * @ - _ + . /。其他所有的字符都会被转义序列替换。
提示: 使用 unescape() 方法对字符串进行解码
实例
使用 escape() 来编码字符串:
<script>
document.write(escape("Need tips? Visit W3Cschool!"));
</script>
以上实例输出结果:
Need%20tips%3F%20Visit%20W3Cschool%21
JavaScript unescape() 函数
定义和用法
unescape() 函数可对通过 escape()编码的字符串进行解码。
提示: 使用函数escape() 对字符串进行编码。
实例
在本例中,我们将使用 escape() 来编码字符串,然后使用 unescape() 对其解码:
<script>
var str="Need tips? Visit W3Schools!";
var str_esc=escape(str);
document.write(str_esc + "<br>")
document.write(unescape(str_esc))
</script>
以上实例输出结果:
Need%20tips%3F%20Visit%20W3Cschool%21
Need tips? Visit W3Cschool!
函数的定义
function 函数名(参数列表){
语句; //函数(方法)主体
return 返回值;
}
1.参数列表:表示函数的输入
2.函数主体:表示为了实现某一功能代码块
3.函数可以有返回值,也可以没有
4. 方法可以没有返回值,但最多只能有一个返回值。
3、函数的几种调用方式
①函数名(传递给函数的参数1,传递给函数的参数2,…)
②变量=函数名;(不推荐用)
此时变量就相当于函数的引用(指针),可以这样调用函数:
变量(实际参数…)
特别说明
1.对于有返回值的函数调用,也可以在程序中直接使用返回的结果,例如:alert("res="+sum(2,3));
2.没有返回值的函数,则返回undefined。
函数调用的方式
1.普通调用
函数名(实际参数…);
2.通过指向函数的变量去调用
var myvar=函数名;
myvar(实际参数);
3.关于接收函数返回值的问题
var myvar=test('abc');
//如果test函数没有返回值,但是你又接收了,则返回的就是undefined
//先输出函数调用abc,然后再输出undefined
window.alert(myvar);
//如果有返回值,则,是什么就是什么
函数——调用过程
递归,下面的js代码会输出什么
<html>
<head>
<scriptlanguage="javascript">
//abc是一个函数,它接收数值
functionabc(num1){
if(num1>3){
abc(--num1);//递归
}
document.writeln(num1);
}
abc(5);
</script>
</head>
<body></body>
</html>
先复习下:++和--
b=++a;先自加,然后再赋值;
b=a++;先赋值,然后再自加;
程序依次打印输出:3 3 4。
对执行函数时,就要开辟新栈,新栈执行完毕后,就要被销毁,然后退回。
函数——深入使用
①函数的参数列表可以是多个
②函数列表可以是多个,并且数据类型可以是任意的类
③js支持参数个数可变的函数
④js支持创建动态函数
<html>
<head>
<scriptlanguage="javascript">
//编写一个函数,可以接受任意多个数,并计算他们的和
functionabc(){
//在js中有一个arguments,可以访问所以传入值
//打印参数的个数
//window.alert(arguments.length);
//既然能得到参数的个数,就用for循环遍历,参数具体的值
//遍历所有的参数
varres=0;
for(vari=0;i<arguments.length;i++){
window.alert(arguments[i]);
res+=arguments[i];
}
window.alert(res);
}
abc(4,3,5);
</script>
</head>
<body></body>
</html>
注:
(1)javascript是弱数据类型语言
(2)特别强调一下,js的函数天然支持可变参数。javascript天然支持可变,之所以天然支持可变,和语言本身的特点是有关系的,因为它是动态语言,它在执行的瞬间才去判读
(3)javascript不支持重载.
(4)js的基本类型是按值传递的(对象除外)
(5)对象按共享传递
按共享传递的理解:
可以把一个对象拆成3部分
1、变量的地址
2、值或对象的地址
3、对象中储存的值
方法传递的是:1和2,即复制1和2的值将其作为参数传入方法中
方法1中:
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!
改变的是3的部分,3在内存中只有一份,方法内和方法外的2指向同一个3,因此改变了o.x
方法2中:
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.
改变的是2的部分,方法内和方法外的2在内存中有2份,改变其中一份并不影响另一份