本文章将会用10分钟时间无死角的解析JS的传参方式,希望能对您有所帮助。
先说结论,JS只有值传递,没有引用传递。这句话可能会颠覆一些小伙伴的认知,但请先别急,马上你将会赞同我。
值传递是什么?
在函数传参的过程中,实参将数值传递给形参。
EXP:
function fun(x) {
console.log(x)
}
let a = 123
fun(a)
1
2
3
4
5
6
1
2
3
4
5
6
运行结果
在fun(a)这个函数调用语句中,实参为a、形参为x,从输出结果来看,可以证明实参a将数值123传给了形参x。
疑问:是否可以通过形参x数值的修改,来改变实参a的值?
EXP:
function fun(x) {
x = 666
}
let a = 123
fun(a)
console.log(a)
1
2
3
4
5
6
7
1
2
3
4
5
6
7
运行结果:
可以看到实参a的数值并没有因为x的改变而发生变化。是因为值传递的特点决定,咱们接着往下看。
2、值传递的特点:
单向传递,只能将实参的数值传递给形参,不能将形参的值传递给实参。
EXP:
我们希望编写一个交换两个变量数值的函数swap。
以下是纯js+html实现的增删改操作代码,你可以参考以下。当然也可以使用jquery之类的框架来实现,最终的原理都是一样的。
<html><head>
<title>增删改查</title>
<style type="">
tr{
text-align:center
}
</style>
<script type="text/javascript">
//通过新增按钮来控制表格的显示与隐藏
var optionFlag = "save"
var updateRowIndex = -1
var checkFlag=false//默认为不显示
function show() {
optionFlag = "save"
var f = document.getElementById("did")//获得id为did的 div
if(!checkFlag) {
f.style.visibility="visible"
}else{
f.style.visibility="hidden"
}
checkFlag=!checkFlag
}
//通过保存按钮将数据添加到表格中
function insertRow_() {
switch(optionFlag) {
case "save" :
insertRow_$save()
break
case "update" :
insertRow_$update()
break
default :
alert("操作失败。。。")
}
function insertRow_$save() {
//通过id获得要添加数据的表格
var table = document.getElementById("tableid")
//将所输入的内容赋给定义的变量
var titleName = document.getElementById("title").value
var digestName = document.getElementById("digest").value
var authorName = document.getElementById("author").value
//获取下拉框内的内容
var selectIndex_ = document.getElementById("select")
var option = selectIndex_.options[selectIndex_.selectedIndex]
var selectName = option.text
//获取编号的内容
var numberid = table.rows.length
//在表尾添加一行数据
var row_ = table.insertRow(table.rows.length)
row_.insertCell(0).innerHTML = numberid
row_.insertCell(1).innerHTML = titleName
row_.insertCell(2).innerHTML = digestName
row_.insertCell(3).innerHTML = authorName
row_.insertCell(4).innerHTML = selectName
row_.insertCell(5).innerHTML = '<input type="button" value="修改" onclick="update_(this.parentNode.parentNode)"></input>&nbsp<input type="button" value="删除" onclick="delete_(this.parentNode.parentNode)></input>'
document.getElementById("title").value = ""
document.getElementById("digest").value = ""
document.getElementById("author").value = ""
document.getElementById("select").options[0].selected="true"
var f = document.getElementById("did")
f.style.visibility="hidden"
alert("保存数据成功!!!")
}
//修改后的保存
var tr
function insertRow_$update() {
var table = document.getElementById("tableid")
tr = table.rows[updateRowIndex]
var p = document.getElementById("title")
tr.cells[1].innerHTML = p.value
p = document.getElementById("digest")
tr.cells[2].innerHTML = p.value
p = document.getElementById("author")
tr.cells[3].innerHTML = p.value
p = document.getElementById("select")
var Index_ = p.selectedIndex
var option = p.options[Index_]
var selectName = option.text
tr.cells[4].innerHTML = selectName
document.getElementById("title").value = ""
document.getElementById("digest").value = ""
document.getElementById("author").value = ""
document.getElementById("select").options[0].selected="true"
var f = document.getElementById("did")
f.style.visibility="hidden"
alert("修改数据成功。。。")
}
}
//通过删除按钮 删除当前所在行
function delete_(row_) {
var table = document.getElementById("tableid")
table.deleteRow(row_.rowIndex)
refurbish_()
alert("删除数据成功!!!")
}
//刷新
function refurbish_() {
var table = document.getElementById("tableid")
//获得table的行数
var rows = table.rows
for(var i=1i<rows.lengthi++) {
rows[i].cells[0].innerHTML = i
}
}
//通修改按钮对table里的数据进行修改
function update_(row) {
updateRowIndex = row.rowIndex
optionFlag = "update"
//对table里的数据进行回显
document.getElementById("title").value = row.cells[1].innerHTML
document.getElementById("digest").value = row.cells[2].innerHTML
document.getElementById("author").value = row.cells[3].innerHTML
var selectText = row.cells[4].innerHTML
var sel = document.getElementById("select")
var ops = sel.options
for(var i=0i<ops.lengthi++) {
if(selectText==ops[i].text) {
sel.options[i].selected = "true"
}
}
var f = document.getElementById("did")
f.style.visibility="visible"
}
</script>
</head>
<body>
<input type="button" value="新增" onclick="show()"></input>
<div>
<table border = "1" cellspacing = "0" id="tableid" width=100%>
<tr bgcolor="yellow">
<th>编号</th>
<th>标题</th>
<th>摘要</th>
<th>作者</th>
<th>类别</th>
<th>操作</th>
</tr>
<tr>
<td>1</td>
<td>dgsdg</td>
<td>sdgfd</td>
<td>ghfhh</td>
<td>基金</td>
<td>
<input type="button" value="修改" onclick="update_(this.parentNode.parentNode)"></input>
<input type="button" value="删除" onclick="delete_(this.parentNode.parentNode)"></input>
</td>
</tr>
</table>
</div>
<br>
<div align="center" id="did" style="visibility:hidden">
<form action="">
<table>
<tr>
<td>标题:</td>
<td><input type="text" id="title"></input></td>
<td>摘要:</td>
<td><input type="text" id="digest"></input></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" id="author"></input></td>
<td>类别:</td>
<td align="left">
<select id="select">
<option>证劵</option>
<option>基金</option>
<option>股票</option>
</select>
</td>
</tr>
</table>
<br>
<center>
<input type="button" value="保存" onclick="insertRow_()"></input>
<input type="reset" value="重置"></input>
</center>
</form>
</div>
</body>
</html>
//①ji与android交互//js调用android方法
window.类.方法名称(参数1,参数2)
//android调用js方法(loginIn:方法名称,uname:参数)
//activity.loadUrl("javascript:loginIn('" + uname + "')")
//②js与ios交互
//js调用ios方法(objc:协议)
window.location.href='objc://方法名称|参数1|参数2'
//ios调用js方法:
同android
其中:android的activity如下:
@Overridepublic void onCreate(Bundle savedInstanceState) {
// setFullScreen(true)
Intent intent = new Intent(getApplicationContext(),
SplashActivity.class)
startActivity(intent)
super.onCreate(savedInstanceState)
super.init()
// Set by <content src="index.html" /> in config.xml
activity = this
// this.appView.setBackgroundResource(R.drawable.welcome)// 设置背景图片
//
// super.setIntegerProperty("splashscreen", R.drawable.welcome)
// 设置闪屏背景图片
// super.setBooleanProperty(name, value)
// super.loadUrl("这里是html页面的路径")
super.appView.addJavascriptInterface(new Fu(), "这里是类名(js中需要通过这个类名访问android方法)")
super.loadUrl(Config.getStartUrl())
// super.loadUrl("file:///android_asset/www/index.html")
// mController.openShare(activity, false)
// try {
// getToken()
// } catch (NoSuchAlgorithmException e) {
// // TODO Auto-generated catch block
// //e.printStackTrace()
// }
}