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));

正如上面看到的,它是一个包含了传过来参数的数组(底层只是一个类数组)。

本文永久更新链接地址

相关内容

    暂无相关文章