首先來理解一下什麼事物件:ecma-262是這樣定義的「無序屬性的集合,其屬性可以包含基本值、物件或者函式」,也就是說,物件是『名/值』對的集合。
var person=new object();
person.name="jake";
person.age=18;
person.sayname=function()
上面的例子建立了乙個名為person的物件,並為它新增了兩個屬性:name、age和乙個方法sayname。其中sayname用於顯示this.name(將被解析為person.name)的值。
我們來看一段**:
var add=function(a,b)
函式字面量包含4個部分,分別是:
函式字面量可以出現在任何允許出現的地方,也可以定義在其他函式中。乙個內部函式除了可以訪問自己的引數和變數,同時它也能自由地訪問它的父函式的變數和引數。通過函式字面量建立的函式物件包含乙個連線到外部上下文的鏈結。這被稱為閉包
閉包這個概念是js這門語言中乙個非常重要而且是很難掌握的知識點!
這裡只能淺顯地解釋一下什麼是閉包
我們用一些**來解釋這個定義:
function foo()
return bar;
}var baz=foo();
baz();//2 <--這就是閉包的效果
函式bar()的詞法作用域能夠訪問foo()內部作用域,然後將bar()函式本身當作乙個值型別進行傳遞。
在foo執行後,其返回值 bar()賦值給變數baz並呼叫baz(),實際上只是通過不同的識別符號引用呼叫了內部的函式bar()。
在foo執行後,foo內部作用域不會被銷毀,因為一直都是bar()本身在使用,所喲foo內部作用域依然存在且能夠一直存活,以供bar隨時進行引用。
bar依然對該作用域保持引用,而這個引用就叫作閉包。
作用域的作用:控制著變數與引數的可見性以及生命週期。
定義在函式內部的引數和變數在函式外部是不可見的,而在乙個函式內部任何位置定義的變數,在函式內部任何位置都可見。
var f00=function();
//此a=3,b=5,c沒有定義;
bar(); //此時a=21,b=5;
}
方法呼叫模式
當乙個函式被儲存為物件的乙個屬性是,我們稱之為方法。當乙個方法被呼叫時,this被繫結到該物件,當物件與方法用「.」來連線時,那麼它就被當作乙個方法來呼叫了。
var person=
};person.sayage(19);
docunment.writeln(person.age);//19
2.函式呼叫模式
當乙個函式並不是乙個物件的屬性時,那麼它就是被當作乙個函式來呼叫的
var myobject=
//新增乙個新的方法
myobject.do=function(value);
helper();
}myobject.do(3);
console.log(myobject.value)//6
這裡面遇到乙個問題,就是在helper函式內部的this指向的時這個函式本省,而不是全域性物件。我們找到乙個很好的解決方法,那就是將this賦值給乙個全新的變數that,那麼內部函式就可以訪問到this,這樣就避免了內部函式裡面的this錯誤的繫結。
3 構造器呼叫模式
乙個函式,如果建立的目的就是希望結合new字首來呼叫,那就被稱為建構函式
如果乙個函式前面帶上new來呼叫,那麼就會建立乙個連線到該函式的prototype(原型)成員的新物件,同時函式中的this會繫結到這個新物件中。
var myobject=function(string)
myobject.prototype.get_status=function()
//建立例項
var newobj=new myobject("hello !");
console.log(newobj.get_status());
//hello !
這裡要特別注意:按照慣例,建構函式始終都應該以乙個大寫字母開頭,而非建構函式則應該以乙個小寫字母開頭。
var array=[3,4];
var statusobj=;//status值為『hello』
function speciallarray()
return values;
}var color=new speciallarray("blue","yellow","red");
console.log(colo.topipedstring);
//"blue|yellow|red"
關於js中的array部分
什麼是陣列?陣列就是一組資料組合在一起,並且每個資料都可以單獨拿出來使用 建立陣列的三種方式 方法一var arr new array arr 0 n1 arr 1 n2 方法二var arr n1 n2 方法三var arr new array n1 n2 使用document.write arr...
關於js寫在head部分的問題
當我們將js寫在head部分時,我們要知道,html頁面的載入順序是從上到下的,如果我們寫的js 需要在文件載入完成後才能夠去執行 一般都是要到文件載入完才執行的 那麼我們放到內可能導致無法獲取物件的情況 為了避免類似情況的發生,可以使用以下方式 1 將指令碼 放在網頁的底端,執行指令碼 的時候,可...
《JS語言精粹》學習筆記 函式部分 閉包
要理解閉包,首先要理解變數作用域,變數的作用域就兩種,全域性變數和區域性變數,函式內部可以直接讀取全域性變數,函式外部無法讀取函式內部的區域性變數。閉包定義 能讀取函式內部區域性變數的函式就是閉包,而只有函式內部的子函式才能讀取區域性變數,所以本質上,閉包就是將函式內部和函式外部鏈結起來的一棟橋梁。...