好了,现在开始函数这一章节,这之后就开始面向对象,加油吧,多看点。
4.1 内建的全局函数
javascript中内建了很多预定义的函数(也叫做全局函数或者顶级函数),用于处理常见的操作。可以看作是Global类的方法,并且常量Infinity和NaN可以看作是Global类的属性,方法包括escape(), eval(), isFinite(), inNaN(),parseFloat(), parseInt(),Boolean(), Number(), String(), unescape(), encodeURI(), decodeURI(), encodeURIComponent(), decodeURIComponent()。
值得一提的就是eval(), encodeURIComponent(), decodeURIComponent().。
eval():
var x3 = "good!"; var x = 3; var y = eval("x"+x); //获取变量x3,也即 y = x3; document.write(y); //输出good!
encodeURIComponent():
在网上找了一篇文章,感觉还行escape()、encodeURI()、encodeURIComponent()区别详解 里面有相关代码,也是W3school上范例,记忆中自己也写过有关URL解析的代码,结果后来找到了下面一段,感觉写的不错,用一个函数封装好了,索性也就贴出来了。
//其实是解析url传递的参数的 function analysisUrl(){ var vals =[]; var query= location.search.substring(1).split('&'); var i =0; var index; for(;i<query.length;i++){ index = query[i].indexOf("="); vals[i] = query[i].substring(index+1); }
var add = new Function("x","y","return x+y"); //等价于 function add(x,y){ return x+y; }
return vals; } function loadData(){ var busData; var vals = analysisUrl(); console.log(vals.length); var customerId = vals[0]; //从这里开始,就可以换成你所需的参数的名字 var startDate = vals[1]; var lastDate = vals[2]; }
4.2 自定义函数
函数定义有三种方法:
1) 最常见的,也是推荐的--函数语句:
function myFunc(arg_1,arg_2){
//执行语句
}
2) 函数表达式定义函数(匿名函数)
var myfunc = function(arg_1,arg_2){
// 执行语句
}
3) 使用function类定义函数
var myFunc = new Function([arg1,arg2],functionBody);
前两种函数定义方法的区别:
区别有很多呢,简单的说就是推荐使用第一种,我在一个视频教程上说第二种有严重的性能问题,不推荐。下面具体看一下吧。
1)用函数语句定义不管在定义之前还是之后都能被脚本引用,简单地说就是看下面代码:
//函数语句,这样是可以的 myFunc(); function myFunc(){} //函数表达式,这样是不可以的 myFunc(); var myFunc = function(){}
2) 函数表达式作为另一些函数或方法的参数,这个不就是用匿名函数作为参数么,随便给段代码吧:
$.ajax( { url : 'getSecondIdAction.action?t=' + new Date(), type : 'post', async : false, datatype : 'json', success : function(data) { //函数表达式 secondIdData = data; secondIdCombox = $('#secondId').combobox( { valueField : 'dptid', textField : 'dptname', data : secondIdData, onSelect : function(record) { //函数表达式 thirdIdCombox.combobox('clear'); changeThirdIdData(record.dptid); managerScoreQuery(record.dptid); } });
3) 如果记得在学习笔记1中的显式释放,垃圾回收机制的话,那在这边函数表达式就可以这样用。代码就不贴了。
总结:如果没有特殊用途,就使用函数语句吧,函数表达式就是用在使用一次后便丢弃的函数,这样有利于内存管理(匿名函数不都是这样用的么)。还有就是像prototype属性附加函数以实现对象方法的定义,在面向对象编程中较多。
4.3 匿名自执行函数
函数是一个封闭的作用域范围,并且可以嵌套函数,所以可以使用这种匿名自执行函数来实现封装自己的所有函数和变量,从而避免来自多个开发者的多个函数相互冲突。用到了闭包的原理,这个留待以后详细解决吧,很重要的一个概念。
(function(){ //一些执行语句 })(); //添加参数 (function(arg1,arg2){ //一些执行语句 })(arg1,arg2); //如果用过JQuery的话,肯定会对下面的代码有印象的,就是用到了匿名函数自执行. $.document.ready(function(){ //一些执行语句 });
在JQuery中用到了很多这样的匿名自执行函数。其实学javascript也是因为Jquery。
var o = new Object(); (function(obj){ obj.myFunc = function(){ //执行语句 }; var name = "13123"; obj.username = name; })(o); alert(o.username); alert(o.myFunc());
如果自己写插件的话,就将全局对象window作为参数传进去。
惭愧,惭愧,我以为这一章结束了呢,结果。。。后面还有挺多东西的呢,那就下一章再写吧。