JavaScript函数部分

 对象:
     JavaScript的对象字面表示法允许仅仅列出对象的组成部分就能创建对象。这也是json的灵感来源。所谓的对象字面量就是包含在{}中的多组键值对。
var stooge={
'first_name' : 'jack' ,
'last_name' : 'ma'
};
     取对象内的值可以用stooge['first_name']或者是stooge.first_name。
     从undefined的对象中取值是违法的,如stooge.name.me ,此时会报TypeError错误。解决办法是用&&,stooge.name&&stooge.name.me,此时返回undefined。
     更改对象内的值用stooge.first_name='mark';,如果first_name不存在,则会向对象中添加新的属性。
     遍历对象用for或者是for  in。
for(var name in stooge){
alert(stooge.name);
}
for in的缺点是遍历对象中的属性是没有顺序的,为了有顺序的输出可以使用for
var names=['first_name ','last_name '];
for(var i=0;i<names.length;i++){
alert(stooge.names[i]);
}
     删除对象中的属性用delete。delete stooge.first_name
原型:
     每个对象都连接到一个原型对象,并且可以从中继承属性。通过字面量创建的对象都连接到Object.prototype上。原型连接只有在检索时才有用(这个很有用,我们需要知道更改操作不会改变原型中的值),如果检索一个对象的属性,这个对象没有就会检索它指向的原型对象,直到最终的Object.prototype,最后也没有就返回undefined。
函数:
     函数就是对象,对象的原型链终点是Object.prototype,函数的原型链终点是Function.prototype。
     函数的创建:
     每个函数在创建时会附加两个属性,一个函数的上下文,一个是函数实现的代码(函数实现的代码也被称为“调用”属性,当调用一个函数的时候可以看做是调用这个函数的调用属性)。
var add=function(var a,var b){
return a+b;
};
上面就是用字面量创建的函数。通过字面量创建的函数包括一个连接到上下文的连接(就是所谓的闭包)。
     函数的调用:
     被调用的函数除了接收声明的参数外还会接收this和arguments参数。this的值取决于调用的模式,一共有四种调用模式:方法调用、函数调用、构造器调用、apply调用。
     方法调用:
var myObject={
var value=0;
add:function(i){//在这里函数被声明为方法
return this.value+i;//这里的this就是myObject
}
};
myObject.add(2);//这就是函数的方法调用。通过方法调用函数中的this就是所属对象本身。
     函数调用:(易错点在这里)
为了说明这点,先进行如下的说明,之后再看一个例子。这里要注意的是,在进行函数调用的时候this指代的是全局的windows,这个问题的直接影响是在函数的内部函数调用时
var i=100;
var MyObject={
    i:10,
    out:function (value) {
        var inFun = function () {
            alert(value + this.i);
        }
        inFun();//这里是函数调用
    }
}
MyObject.out(10);//这里是属性(方法)调用
上面的例子中inFun()调用时为函数调用,this指的是windows,因此this.i=100。最终的结果是110。
为了解决上面的问题,可以用下面的方法:
var i=100;
var MyObject={
    i:10,
    out:function (value) {
        var that=this;//在这里将方法调用传来的this先绑定到that属性上,在下面用时就不会发生上面的问题了
        var inFun = function () {
            alert(value +that.i);
        }
        inFun();
    }
}
MyObject.out(10);
     构造器调用:
我不喜欢这种方式的函数调用,对于已经熟悉java的我来说看着觉得很怪,本来将函数赋值给变量就怪了。这里就简单的说说。
var MyOb=function(ss){
    var sta;
    this.sta=ss;
}
MyOb.prototype.fun= function () {
    return (this.sta);
};
var oo1=new MyOb('oo1');//在new的时候会去调用MyOb函数就是这里的关键,这个函数会在背后创建一个对象赋给oo1,MyOb中的this就是这个新创建的对象,也就是oo1
var oo2=new MyOb('oo2');
alert(oo1.fun());//返回oo1,因为每个sta都是保存在对应的对象中
alert(oo2.fun());//返回oo2

  apply调用:这个调用容许我们手动的传递this。
var MyOb=function(){
    return (this.sta);//这里的this就是app
}
var app={
    sta:"i am ok!"
}
var res = MyOb.apply(app);//在这里手动将app赋值给this
alert(res);
这里函数的调用并没有完,因为上面说了的除了this还有一个arguments参数。线面就看看这个参数有什么作用。
var fun= function () {
    var i=0;
    var sum=0;
    for(i;i<arguments.length;i++){
        sum+=arguments[i];
    }
    return sum;
}
alert(fun(1,2,3,4,5));
正如上面看到的,它是一个包含了传过来参数的数组(底层只是一个类数组)。
posted @ 2015-11-12 22:52  codeZhu  阅读(1179)  评论(0编辑  收藏  举报