js函数中什么是形参,什么是实参,两者有什么区别?

JavaScript016

js函数中什么是形参,什么是实参,两者有什么区别?,第1张

5个,这里没有什么疑问的!

从形式上看很看是两个的,因为有二个为一组做为一个对象,有三个为一组做为一个对象,共有两个.所以应该说是两个,而从我的感觉当中这样是不对的,因为在JS中不存在(exp1,exp2)这样的定义方法,他不是{1,2}而是(1,2),而且()的做用除了VB中的索引外,在JS中只是改变了运算符的优先顺序,而这里改变的显然是,运算符的优选顺序,而,运算本身的优选顺序是自左向右,所以这里除了改变顺序达到一个特殊目的,但如果不考虑这个特殊目的,那么,加了括号跟不加是没有区别的.所以这里的参数是五个而不是两个!

当然你完全可以做一个验证:定义一个有五个形参的函数,然后加括号传值,看一下是否成功!

要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型。

1、基本类型

基本的数据类型有:undefined,boolean,number,string,null。 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值。

当基本类型的数据赋值时,赋得是实际的值,a和b是没有关联关系的,b由a复制得到,相互独立。(字面量的才是基本类型)

var a=10

var b=a

console.log(a+','+b)   // 10,10

a++

console.log(a+','+b)  // 11,10

2、引用类型

引用类型指的是对象。可以拥有属性和方法,并且我们可以修改其属性和方法。引用对象存放的方式是:在栈中存放对象变量标示名称和该对象在堆中的存放地址,在堆中存放数据。

对象使用的是引用赋值。当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在堆中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

3、数组是引用类型

我们先来看一个例子:

var a = [1,2,3]

var b = a

a = [4,5,6]

alert(b) //[1,2,3]

好像数组是基本类型一样。。,但是:

var a = [1,2,3]

var b = a

a.pop()

alert(b) //[1,2]

这是怎么回事?因为:(知乎解释)

a = [4,5,6]//改变的是a引用本身,没有改变数组对象,a和b没有了关系。

a.pop()//改变的是数组对象,a引用没有改变。

b = a//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。

//所以改变a引用并不会对b引用造成影响,改变数组对象可以。

这个问题就跟我之前在React todo-list 一篇中提到的问题一样:

var tasks=this.state.data

tasks=tasks.filter(function(i){

return i.index!=taskId

})

由于filter函数是返回一个新的数组,虽然仍然用tasks去接收,但这时候tasks的指向已经是新数组啦,所以tasks和data已经不在有关系。(concat也是返回新数组)

而push和splice函数是在原数组上操作,所谓在原数组操作,指的是指向不变,所以tasks和data是相关联的。

4、参数传递

js的函数参数传递为值传递。

当传入的是 基本类型的参数时:就是复制了份内容给i而已,i与age之间没有关系。

function setAge(i)

{

alert(i)//24

i = 18

alert(i)//18,i的改变不会影响外面的age

}

var age = 24

setAge(age)

alert(age)//24

当传入的参数为引用类型时:

function setName(obj)

{

obj.name = 'haha'

}

var obj2 = new Object()

setName(obj2)

alert(obj2.name)   //  haha

这看起来很像是传递的是引用,因为obj.name受到改变了,但其实不是,其实还是值,因为obj2本身的值就是新对象的地址,所以传进去的就是这个地址。

这是阿里2014年的笔试题:

var a = 1

var obj = {

b: 2

}

var fn = function () {}

fn.c = 3

function test(x, y, z) {

x = 4

y.b = 5

z.c = 6

return z

}

test(a, obj, fn)

alert(a + obj.b + fn.c)

答案:12

首先test传递进去的实参中,a是基本类型(,复制了一份值),obj是object(指向地址,你动我也动),fn也当然不是基本类型啦。在执行test的时候,x被赋值为4(跟a没关系,各玩各的,a仍然为1),y的b被赋值为5,那obj的b也变为5,z的c变为6,那fn的c当然也会是6. 所以alert的结果应该是1+5+6 =12. (其实test不返回z也一样,z仍然改变的)。

我推荐你使用事件绑定去做,代码会比较简单。一般是不推荐onclick属性的,比较新的代码都会用事件榜定。

加一个辅助ID,如:

<a id="yourid" href="javascript:void(0)">对外隐藏</a>

jquery有一个data方法,可以为元素存储一个值。在点击链接时,可以动态地改变真假值,来改变事件的行为。这样不需要改变已经绑定的事件。

$("#yourid").data("state", false)

$("#yourid").click(function(){

    var s = $(this).data("state")

    // 判断s的值,隐藏或显示

    // 这个函数的内容需要修改,这里只做一个示例

    updateShow("1014", s, $(this))

    // 改变state的值,下次就是true了

    $(this).data("state", !s)

})

还有一种办法,使用toggle切换

$("#yourid").click(function(){

    $("#yourid").toggle(

        function(o){ updateShow('1014', true, $(this) }, 

        function(o){ updateShow('1014', false, $(this) }

    )

})

绑定一个事件,在事件中调用toggle。这样每次点击会在两个不同的函数间切换。第一次点击执行第一个函数,第二次点击执行第二个函数。

您的采纳就是我的动力!