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));
正如上面看到的,它是一个包含了传过来参数的数组(底层只是一个类数组)。