首页 > 代码库 > 第三章 基本概念(第五部分:函数初步)
第三章 基本概念(第五部分:函数初步)
六. 函数初步
无论在哪门语言,函数都是一个相当核心的概念。通过函数可以封装任意多的语句,刻意在任何地方调用执行。函数实质上是一个短小的脚本,需要反复做一件事时,可以利用函数避免重复键入过多重复的代码。良好的编程习惯要求,先定义函数,再使用它们。定义函数用法如下:
function 函数名(参数){函数代码;}
比如封装以下代码:
var beatles=["Joln","Paul","George","Ringo"];for(var count=0;count<beatles.length;count++){alert(beatles[count]);};声明为函数shout并调用的语句是:function shout(){var beatles=["Joln","Paul","George","Ringo"];for(var count=0;count<beatles.length;count++){alert(beatles[count]);}};//以下是调用。shout();
1. 返回值
就是函数的的执行结果。函数可以没有返回值。一个空函数返回的是undefined。因此可以通过return语句来给函数指定一个返回值,这样函数会更加实用。请注意:执行完return之后,函数后边的语句将不会执行。
一个函数应该只返回一种类型的值。
当然,把结果直接返回给这个函数的语句,会更加实用。因此引出return语句。
【例1】12mol/L 的HCl溶液转换为g/ml计量是多少?
HCl摩尔质量(Molar Mass)为36.5g/mol,体积重量(volume)的化学计算公式为36.5g/mol * 1mol/L * 1/1000=0.0365g/ml。
因此在js中定义函数
//定义函数体积重量换算法则:function ConverToVolume(temp){var resaut=temp*36.5/1000;return temp;};//函数只有一个参数,用temp代替。var temp_MolarConcentration=12;//当摩尔浓度为12mol/L时var volume=ConverToVolume(temp_MolarConcentration);/*赋予体积重量为变量volume。为函数表达式ConverToVolume(temp_MolarConcentration),已返回值到volume。*/alert(volume);//显示volume的值。
2. 参数(argument)
在数学函数中,二元函数可以表示为f(x,y)。在JS中,x,y就是这个二元函数的参数。
比如f(x,y)=x+y
在js应该定义为复合函数,应该这样写
function f(x,y){var total=x+y;alert(total);}//声明函数。x=3;y=7;f(x,y);
输出结果为10。如果直接调用f(),输出结果为NaN(Not a Number)。更简单地,可以直接书写:
f(3,7);
参数分为可变参(不定参)和不变参。
function(arguments){} arguments:参数的个数是可变的。
【例2】任意多个数据求和函数:
function sum () { arguments var result=0 for(i=0;i<arguments.length;i++){ result+=arguments[i]; } alert(result); // body...}sum(2,3,5,7)
理论上js可以传递任意个参数。参数在js的表述就是arguments。
【例3】自己封装一个实用的css函数:模拟一个jq(Jquery)函数。jq的css既可以设置又可以获取。(xxx.css(名字,属性)格式)
html代码如下:
<div id="div1" style="width:200px;height:200px;background:red"></div>
js代码
function css () { if(arguments.length==2){//获取 return arguments[0].style[arguments[1]]; }else if (arguments.length==3) {//设置 arguments[0].style[arguments[1]]=arguments[2]; /*对象.样式=属性值*/ }; // body...}
//以下是调用过程window.onload=function(){ var oBtn=document.getElementById(‘btn1‘); var oDiv=document.getElementById(‘div1‘); oBtn.onclick=function(){ //css(oDiv,‘background‘,‘green‘) //以上语句可选:可选设置绿色 //alert(css(oDiv,‘width‘)); //以上语句可须按:获取宽度 //此CSS参数有可能是2个参数,也可能是3个参数 }}
以上函数只能设置行间样式,但实际工作中很少去写行间样式。问题来了,如何去取非行间的样式呢?
用currentStyle来取计算后的样式。把上述代码的style替换为currentStyle就可以了。currentStyle取哪的样式都可以。但是浏览器兼容性会出现问题。只能在ie9以上的ie下能用!
那怎么办呢?用getComputedStyle!意思还是获取计算后的样式。
getComputedStyle(对象,false).属性
但是在ie下getComputedStyle又是用不了的。
现在要做ie和火狐的兼容。
封装一个获取计算后样式的函数:
function getStyle(obj,attr){ //元素,样式 if(obj.currentStyle){ return obj.currentStyle[attr] }else{ return getComputedStyle(obj,false)[attr]; }}
调用时:
function css () { if(arguments.length==2){//获取 return getStyle(arguments[0],arguments[1]); }else if (arguments.length==3) {//设置 arguments[0].style[arguments[1]]=arguments[2]; /*对象.样式=属性值*/ };}window.onload=function(){ var oBtn=document.getElementById(‘btn1‘); var oDiv=document.getElementById(‘div1‘); oBtn.onclick=function(){ //css(oDiv,‘background‘,‘green‘) alert(css(oDiv,‘width‘)); //获取宽度 //此CSS参数有可能是2个参数,也可能是3个参数 }}
这个函数就算完整了。
改善可读性:
arguments[0].style[arguments[1]]=arguments[2];
这样的代码读起来太不友好了。不如改善一下。实际上在函数中定义若干个参数,本质上1和argument[]是一一对应的。所以写函数时
function(obj,attr,value){};
后边引用时就有较好的观赏性了。
obj.style[attr]=value
3. 局部变量和全局变量
变量类型(按作用域分) | 用法 | |
全局变量 | 范围是整个脚本。可以在脚本的任何位置引用。 | temp=x*x |
局部变量 | 只存在于声明它函数的内部,在外部无法使用。 | function f(x){var temp=x*x;return temp} 这样temp就不会在函数范围外时生效。 当省略了var符时,temp就变成全局变量! |
函数的特点:应该是一个自给自足的脚本。定义函数时,一定要把内部的变量全部声明为局部变量。
第三章 基本概念(第五部分:函数初步)