js 函数传参,带参数函数的调用方式,闭包
操作方法
- 01
/****************** 函数相关 ******************//********** 一:函数传参 **********//*编程语言大概都有 值类型与引用类型 的区别,JS也不例外。原始类型:undefined null number boolean 均为值类型。string比较特殊,因为它是不可改变的,String类定义的方法都不能改变字符串的内容。function object array 这三种为引用类型。*//*JavaScript 函数传递参数时,是值传递。ECMAScript 中,所有函数的参数都是按值来传递的。基本类型值的传递和基本类型变量复制一致(采用在栈内新建值),引用类型值的传递和引用类型变量的复制一致(栈内存放的是指针,指向堆中同一对象)。具体参考:http://99caipiao.com.cn*/functionsetName(obj){//obj拷贝了person的值(person是一个对象的引用地址),所以obj也指向了person所指向的对象。obj.name = "xiaoxiaozi";obj = {};//让obj 指向了另一个对象obj.name = "admin";}varperson = {};setName(person);alert(person.name);//xiaoxiaozi/********** 二:带参数函数的调用方式 **********//*在DOM不同版本中,函数调用方式不太一样。标准推荐的是addEventListener和attachEvent这两种方式有很多资料可查。但是有些已经不被推荐的函数调用仍旧有实际应用,相关资料发现的不多。这里主要讨论这些函数调用方式*/varg = "全局变量";functionshow(str) {alert("my site: " + str);}setTimeout("show(g);",100);//g是全局变量,函数正确执行functiont() {varurl = "www.xujiwei.cn";varnum = 2;//setTimeout("alert("+url+")", 3000); // 解析错误,www未定义//setTimeout("alert("+num+")", 3000); // 解析正确,注意与上句对比//setTimeout("show('url');", 2000); // url//setTimeout("show("+ url +");", 2000); // 解析错误,www未定义//setTimeout("show(url);", 2000); // 解析错误,url未定义//setTimeout('"show("+ url +");"', 2000); // 解析错误,url未定义//setTimeout("show('"+ url +"');", 2000); // 正确//setTimeout(function(){show(url);},1000); // 正确}t();/*结论:诸如onclick="xx();"等函数调用方式,在双引号内的内容直接解析为js语句执行。若调用的函数带有参数,注意对比以上各种写法,保证传递进去的参数为正确的。*//********** 三:闭包 **********//*闭包,几乎是每个学习JS的朋友都要讨论的问题,因此各种相关资料应有尽有。它的作用很大,但也有弊端,例如如果使用不当,容易引起内存泄漏等问题,因此有不少人提倡少用闭包。这里列出闭包的一种经典应用,一个有争议的应用。*/functiontest1() {//通过闭包,每次能传入不同的j值。for(varj = 0; j < 3; j++) {(function(j) {setTimeout(function() { alert(j) }, 3000);})(j);}}test1();/*这个是闭包的典型应用*/(functiontt() {for(vari = 1; i < 4; i++) {document.getElementById("b" + i).attachEvent("onclick",newFunction('alert("This is button' + i + '");'));http://99caipiao.com.cn//在IE中测试}})()//立即执行函数,一个文件是否只能有一个?把上边函数写成立即执行出问题,怎么回事?/*这个问题出现在论坛里,有很多争议有说是new Function动态生成个闭包结构的函数,所以能保存外部变量。有说是跟闭包无关,new Function,就是新定义了一个function,i的值也作为这个新的function的参数固化在其内部了。*/