第三课 初探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. mac多线程下载神器

    本文参考:https://blog.csdn.net/orangleliu/article/details/46834429 神器:axel 安装(已经安装homebrew前提下,没有请参考:http ...

  2. web前端技术社区分享

    web前端技术社区分享 一.国外的前端技术网站:    1. 名称:W3C: 网址:http://www.w3.org/ 理由:前端技术的规范标准几乎都是W3C制定的  2.名称:ECMA 网址:ht ...

  3. nginx 静态网站配置

    /************************************************************************************** * nginx 静态网站 ...

  4. P3239 [HNOI2015]亚瑟王 期望dp

    这个题一看就是期望dp,但是我有个问题,一个事件的期望等于他所有事件可能行乘权值的和吗...为什么我有天考试的时候就不对呢...求大佬解释一下. 至于这道题,f[i][j]代表前i个有j个发动技能,这 ...

  5. [noip模拟赛]小U的女装

    https://www.zybuluo.com/ysner/note/1329304 题面 有一张\(n\)点\(m\)边的.不一定联通的无向图. 如果选了一条边,就不能选其两个端点. 现在同时选点和 ...

  6. bzoj1878 [SDOI2009]HH的项链——树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 离线树状数组,巧妙的思路呢: 给每种项链记录一个最后出现的位置lst,根据项链最后出现 ...

  7. bzoj3696

    3696: 化合物 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 245  Solved: 131[Submit][Status][Discuss] ...

  8. phpStudy安装配置小记

    一.phpStudy简介 该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的PHP调试环境·该程序不 ...

  9. Spark SQL概念学习系列之Spark SQL入门

    前言 第1章   为什么Spark SQL? 第2章  Spark SQL运行架构 第3章 Spark SQL组件之解析 第4章 深入了解Spark SQL运行计划 第5章  测试环境之搭建 第6章 ...

  10. iOS APNs远程推送流程精简版

    1.去Apple Developer Center里创建应用的信息,指定APP ID(Bundle ID),配置里开启推送功能(Push Notifications). 后续步骤需要用到这个应用的包名 ...