第三课 初探JavaScript魅力-03

函数传参

上节课的时候我们已经讲了什么是函数,实际上,函数在功能上就类似于css的class一样,将一段代码包裹起来使用。为了让函数的功能更加的丰富和实用,我们需要用到的就是函数传参。我们已经提过,JS将参数放在函数名后的圆括号内,而为了具体说明参数怎么使用,我们举一个小例子。

我们在HTML页面中放入一个有颜色的div块,并加入3个按钮,其目的是通过点击按钮来改变div块的颜色。通过前面两节课的学习,我们可以很轻松地写出下面的代码来实现这个功能:

<html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> #div1{ width:200px; height:200px; background:red; } </style> <script> function toGreen() { var oDiv=document.getElementById('div1'); oDiv.style.background='green'; } function toYellow() { var oDiv=document.getElementById('div1'); oDiv.style.background='yellow'; } function toBlack() { var oDiv=document.getElementById('div1'); oDiv.style.background='black'; } </script> </head> <body> <input type="button" value="变绿" onclick="toGreen();" /> <input type="button" value="变黄" onclick="toYellow();" /> <input type="button" value="变黑" onclick="toBlack();" /> <div id="div1"> </div> </body> </html>
 

效果如下:

可以看到,为了实现这一功能我们一共写了三个函数,作用分别是让div块变绿、变黄、变红。这三个函数的结构几乎一模一样:通过getElementById获取到div1并赋值给oDiv,然后修改其background属性,唯一的区别是具体的颜色值不同。所以,有没有办法将这三个函数进行合并呢?自然是有的,方法就是我们这节课要讲的函数传参。

这里,我们先将前面讲函数的定义和调用那个例子拿过来。

function show()
{ //定义
alert("a");
}
show(); //调用

运行网页后会固定弹出内容为“a”的窗口。这样的功能是不是太简单了?如果我希望它弹出的内容是我给定的内容应该怎么做?答案便是使用参数。

参数的使用方法其实很简单,在这个例子里,我们在函数的()放入一个num,这个num类似于前面讲的变量,名字由编写者自定,并且函数定义的时候num自身的值是未知的。如何确定num的值呢?在调用函数的时候,在()内输入的值便是num的具体值。示例如下:

function show(num)
{
alert(num);
}
show(12);

结果如下:

运行程序后,弹出来的窗口值变为了12。我们修改show()里的值,运行结果也会发生相应的变化。于是,我们就可以称num为函数show()的参数。这个例子我们可以看出,函数参数扮演的是占位符的角色,在定义的时候参数仅仅是占据一个位置而没有具体的值,其值在函数调用时才被传入。

值得注意的是,对于一个函数来说,它的参数是可以有很多个的,传入多个参数时,我们用逗号将参数隔开:

function show(a,b)
{
alert(a+b);
}
show(5,12);

结果如下:

需要注意传入的值要和参数一一对应(a=5,b=12)。

现在我们就通过传参的方法将前面的代码进行合并。我们写一个统一的函数setColor,并传入一个color参数(用于决定将div修改为什么颜色),保留前面三个函数的主体部分,只将颜色具体的值修改为color,color具体的值则在button里调用setColor函数时再决定。 修改后的代码如下:

<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
#div1{
width:200px;
height:200px;
background:red;
}
</style>
<script>
function setColor(color){
var oDiv=document.getElementById('div1');
oDiv.style.background=color;
}
</script>
</head>
<body>
<input type="button" value="变绿" onclick="setColor('green');" />
<input type="button" value="变黄" onclick="setColor('yellow');" />
<input type="button" value="变黑" onclick="setColor('black');" />
<div id="div1">
</div>
</body>
</html>

传参的具体内容就是这些,但关于传参,很多初学者都会有这样的疑惑:我们如何判断一个函数是否应该使用参数传递呢?一个比较简单的判断方法是,当我们的函数如果存在一部分内容在定义时无法确定下来,就有使用参数传递的必要。

改变Div的任意样式

刚才的程序里的函数setColor,其作用只能修改div的背景颜色。假设我们想通过一个函数,来改变一个div的各种样式,例如宽,高,边框等,又应该如何对我们的函数进行修改呢?

很明显,想修改Div的任意样式,有两处是无法确定的,一个是具体的样式名(name),一个是具体样式的值(value),因此我们需要两个参数。如果按照我们前面所讲,那么JS函数的写法应该如下:

functionsetStyle(name,value)
{
var oDiv=document.getElementById('div1');
oDiv.style.name=value;
}

实际上,尝试一下就会发现,这个函数是无法正常运行的。原因出在这种写法下,浏览器并不会认为oDiv.style.name中的name和参数中的name是同一个东西,而会认为这是一个叫“name”的样式,当然css中并没有名为“name”的样式,因此无法执行。

为了解决这个问题,我们必须了解第二种操作属性方法。第一种操作属性的方法就是我们已经学过的使用.字符连接,我们之前所有案例都是通过这种方法来操作属性。而第二种操作属性的方法,是通过['属性名']的方法来进行操作。具体的使用方法如下:

function setText()
{
var oTxt=document.getElementById.('txt1');
//第一种操作属性的方法
oTxt.value='dsfasdfasdf';
//第二种操作属性的方法
oTxt['value']='dsfasdfasdf';
}

在这个小例子中,二者不存在任何区别。在平常的书写中,由于第一种比第二种更为简便,因此大多选用第一种写法。而第二种写法的好处是,[]内放置的是一个字符串(关于字符串的具体内容本课末会讲),而字符串可以通过变量来储存,也可以通过参数传递具体的值。因此,前一个案例里想通过参数改变样式名的目的便可以通过这种方法达成。 实现代码如下:

<html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> #div1{ width:200px; height:200px; background:red; } </style> <script> function setStyle(name, value) { var oDiv=document.getElementById('div1'); oDiv.style[name]=value; } </script> </head> <body> <input type="button" value="变宽" onclick="setStyle('width', '400px')" /> <input type="button" value="变高" onclick="setStyle('height', '400px')" /> <input type="button" value="变绿" onclick="setStyle('background', 'green')" /> <div id="div1"> </div> </body> </html>

效果如下:

这样,无论想改变div的什么属性,都可以通过传递参数来实现了。

顺便一提,在JS里,任何使用.字符的地方,都可以用[]代替,例如document.getElementById('div1')可以修改为document['getElementById']('div1'),oDiv.style.[name]可以修改为oDiv['style'][name],具体如何使用视实际情况而定。

字符串和变量——区别和关系

观察前面的代码,可以看到有很多使用""和''的地方,在JS里使用引号标注的就是字符串。变量和字符串之间有什么关联或者区别呢?

说到这里,再提及JS里面一个与变量相对的概念:字面量(常量)。对于字面量来说,其值是固定的,我们可以清楚地知道它是多少。数字,字符串都是字面量。相对来说,变量的具体值则是不确定的,如果单独看变量本身我们是无法确定其值为多少的。

对于变量和参数来说,使用它们是不需要加引号的,而字符串则必须加上引号。 对于下面一个例子:

alert(abc);

我们的本意是想将abc输出,但由于没有加引号,浏览器会认为abc是一个变量,又由于abc没有被定义过值,所以会出现abc没有被定义的报错。字符串和变量在我们以后的课程中会不断地应用到,大家慢慢就会熟悉他们之间的关系和区别。

【JavaScript从入门到精通】第三课的更多相关文章

  1. 【JavaScript从入门到精通】第二课 初探JavaScript魅力-02

    第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...

  2. 【JavaScript从入门到精通】第一课 初探JavaScript魅力-01

    第一课 初探JavaScript魅力-01 JavaScript是什么 如今我们打开一个大型的网站,都会有很多JS效果的功能和应用.对于学过CSS+HTML的同学,即使是像淘宝那样的网站,用一两天时间 ...

  3. 【JavaScript从入门到精通】第一课

    第一课 初探JavaScript魅力-01 JavaScript是什么 如今我们打开一个大型的网站,都会有很多JS效果的功能和应用.对于学过CSS+HTML的同学,即使是像淘宝那样的网站,用一两天时间 ...

  4. 【JavaScript从入门到精通】第二课

    第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...

  5. JavaScript从入门到精通(转)

    JavaScript从入门到精通 转自: https://github.com/Eished/JavaScript_notes 视频连接:https://www.bilibili.com/video/ ...

  6. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  7. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  8. 【JavaScript从入门到精通】第三课 初探JavaScript魅力-03

    第三课 初探JavaScript魅力-03 函数传参 上节课的时候我们已经讲了什么是函数,实际上,函数在功能上就类似于css的class一样,将一段代码包裹起来使用.为了让函数的功能更加的丰富和实用, ...

  9. Hibernate从入门到精通(三)Hibernate配置文件

    在上次的博文Hibernate从入门到精通(二)Hibernate实例演示我们已经通过一个实例的演示对Hibernate的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使 ...

随机推荐

  1. BZOJ_1670_[Usaco2006 Oct]Building the Moat护城河的挖掘_求凸包

    BZOJ_1670_[Usaco2006 Oct]Building the Moat护城河的挖掘_求凸包 Description 为了防止口渴的食蚁兽进入他的农场,Farmer John决定在他的农场 ...

  2. gdb core调试

    原文链接 http://blog.163.com/lanka83/blog/static/32637615200801793020182/http://blog.csdn.net/taina2008/ ...

  3. Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试

    ylbtech-Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试 1.返回顶部 1. Java 实例 - 字符串性能比较测试  Java 实例 以下实例演 ...

  4. error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR”

    vs2008提示 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR” 在外面用vs2005编写mfc程序的 ...

  5. linux文件名乱码时删除或改名的方式(转载)

    转自:http://www.linuxsa.cn/when-linux-file-name-topsy-turvy-deleted-or-renamed.html linux文件名乱码时删除或改名的方 ...

  6. 记bugku的——“welcome to bugkuctf”

    今天终于拾起来ctf的比赛了,开始了练习之旅.今天写一道bugku上的题目wp,属于利用php源码泄漏的题目吧,我觉得不是很简单...所以把自己的思路放上来. 题目源头:http://120.24.8 ...

  7. HDU1175:连连看(搜索)

    传送门 题意 给定一个n*m的矩阵,询问q次,两个方块是否能被消掉,弯折次数不超过两次 分析 这题写了有一个下午,思路很简单,但是有很多trick,(唉),我还是太弱 trick 初始判断:1.两点不 ...

  8. bzoj 2115: [Wc2011] Xor【线性基+dfs】

    -老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...

  9. poj 1637 Sightseeing tour【最大流+欧拉路】

    参考:https://www.cnblogs.com/kuangbin/p/3537525.html 这篇讲的挺好的 首先分清欧拉路和欧拉环: 欧拉路:图中经过每条边一次且仅一次的路径,要求只有两个点 ...

  10. React 事件 传参

    绑定事件用 bind方法,第一个参数是 this,第二个参数是需要传入的值如下: <a onClick={this.updateLabel.bind(this,'参数1','参数2')} > ...