歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> JavaScript函數部分

JavaScript函數部分

日期:2017/3/1 9:20:48   编辑:Linux編程

對象:

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

正如上面看到的,它是一個包含了傳過來參數的數組(底層只是一個類數組)。

Copyright © Linux教程網 All Rights Reserved