动态选择方法及属性
使用方括号操作符,比点操作符功能更强大。因为可以在[ ]方括号中使用任何代表成员名称的内容访问对象。包括字面量,保存着成员名称的变量,名称组合,三元操作符。所有这些内容都会被处理成一个字符串,然后javascript会用这个字符串来寻找对应的成员。
- 使用方括号操作符
1 object['propertyName'] //=>object.propertyName 2 object['methodName'](arg1) //=>object.methodName(arg1)
- 切换行为
element[shoouldBeVisible ? 'show' : 'hide'](); //IE,假设这里已经有一个isIE变量 element[isIE ? 'simpleEffect' : 'complexEffect']() ;
- 拼接方法名称
element[ (enable ? 'add' : 'remove' ) + 'className' ] ('enabled' ) ;
通过模块模式实现代码访问控制
随着javascript代码库越来越大,全局作用域被“污染”的可能性也就越来越大。这样不仅会导致命名冲突,也为bug提供了温床。
于是,模块模式结实解决这些问题的。模块模式的主要思想是,为那些通过var关键字声明的标识符和函数创建一个私有作用域,只有定义在这个作用域里的函数才能直接访问这些数据。
为了使外界能够访问到汉书里的部分内容,我们有两个选择。其一是返回一个包含选定值的对象,然后把这个对象赋给外界的变量;另一种则是给函数传入一个外部作用域可访问的对象作为参数,使该函数能在这个对象中写入自己的属性(如果想让他的属性成为全局属性,只需传入window对象)。
javascript 中,使用var关键字申明的标识符是局部的(它们只属于当前定义的作用域)。而未使用var关键字申明的标识符是全局的。(它们会被嫁接到当前默认的作用域,而默认作用域在多数情况下就是全局的window对象)。
在匿名函数中使用var关键字:
//在匿名函数中使用var关键字 (function(){ var privateField = 42; function innerFunc(){ notSoPrivate = 43 ; return notSoPrivate ; } alert(privateField); //==>42 innerFunc(); alert(notSoPrivate) ;//=>43 })(); alert(typeof privateField); //=>Undefined alert(notSoPrivate); //=>43 (变量被泄露到外部)
私有属性:
//试试这个例子:“私有属性” var obj = (function(){ var privateField = 42 ; var publicField = 'footbar' ; function processInternals(){ alert('Internal stuff:'+privateField); } function run(){ processInternals(); alert('still private stuff:'+privateField); alert('public stuff:'+publicField); } return{ publicField:publicField, run:run }; })(); obj.run();//3个alert都弹出 obj.publicField ;//footbar obj.processInternals();//Undefined obj.privateField ;//Undefined
使用可选/可变/命名参数
为参数“空值”给出明确定义:
rant = rant||"IE8 must die!";
为了获得函数自身引用,使用arguments的特殊属性callee(返回正在执行的Function对象).
//申明参数(命名参数) function repeat(rant,times){ while(--times>=0){ alert(rant); } } repeat('IE8 must die!',5); //=>连续弹出5个对话框
动态获得不定数量的参数
内置的arguments变量允许你动态访问函数的参数
这使你可以模拟其他语言的可变参数列表
//模拟可变参数列表 function repeat(times){ while(--times>=0){ for(var index = 1,len=arguments.length;index<len;++index){ alert(arguments[index]); } } } repeat(2,'IE8 must die!','So should IE7...');//==>连续弹出4个对话框
//为可选参数设置默认值 function repeat(times,rant){ if(undefined ===rant){ rant = 'IE8 must die!'; } while(--times>=0){ alert(rant); } } repeat(3);//==>连续弹出3个IE8对话框 repeat(3,'So should IE7 do..');//==>连续弹出3个有关IE7的对话框
用字面量对象实现伪命名参数
//用字面量对象实现伪命名参数 function repeat(options){ options = options || {} ; for(var opt in(repeat.defaultOptions || {})){ if(!(opt in options){ options[opt] = repeat.defaultOptions[opt]; } } for(var index = 0 ;index<options.times;++index){ alert(options.rant); } } repeat.defaultOptions = {times;2,rant:'IE8 must die!'} ; repeat() ;//==>弹出2个与IE8有关的对话框 repeat({times:3});//==>弹出3个与IE8有关的对话框 repeat({times:2,rant:'Flash must die!'}); //弹出2个与Flash有关的对话框