javascript进阶修炼之一——javascript必备操做

动态选择方法及属性

使用方括号操作符,比点操作符功能更强大。因为可以在[ ]方括号中使用任何代表成员名称的内容访问对象。包括字面量,保存着成员名称的变量,名称组合,三元操作符。所有这些内容都会被处理成一个字符串,然后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有关的对话框

 

posted on 2015-12-01 09:58  明静  阅读(289)  评论(0编辑  收藏  举报

导航