javascript高級程序設計筆記-1

1、ECMAScript不存在塊級作用域。
如圖,i仍然可以訪問到。
2、ECMAScript沒有函數簽名,所以沒有重載。
3、
4、可以給對象動態添加屬性,不能給基本類型的值添加屬性。
5、函數的參數只能按值傳遞
6、變量的值是對象或者null,則typeof操作符會返回object。
7、
子執行環境向上搜索作用域鏈,即內部環境可以通過作用域鏈訪問外部環境。反之不可以。
8、延長作用域鏈的情況:
9、javascript沒有塊級作用域
10、訪問屬性一般推薦使用點表示法
11、
12、concat()
slice()
splice()
13、
14、
使用不帶圓括號的函數名是訪問函數指針。
15、
concat()
slice()
substring()
substr()
16、所有代碼執行之前,作用域就已經存在兩個兩個內置對象:Global和Math。web瀏覽器實現了承擔global對象角色的window對象。
17、讀取屬性的特性 Object.getOwnPropertyDescriptor()
18、
19、
創建自定義類型的方法,定義引用類型的一種推薦模式:組合使用構造函數模式和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["lucy","lily"];
}
Person.prototype= {
constructor: Person;
sayName:function(){
alert(this.name);
}
}
var person1 = new Person("WeiHanying",23,"Software Engineer");
var person2 = new Person("WuQingfeng",34,"Singer");

person1.friends.push("XiaoBai");
alert(person1.friends);//lucy,lily,xiaobai
alert(person2.friends);//lucy,lily
alert(person1.friends === person2.friends);//false
alert(person1.sayName===person2.sayName);//true
20、
動態原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
var friend = new Person("aa",22,"Software Engineer");
friend.sayName();
使用動態原型模式時,不能使用對象字面量重寫原型。因爲如果在已經創建了實例的情況下重寫原型,會切斷現有的實例和新原型之間的聯繫。
21、
寄生構造函數模式
function Person(name,age,job){
var o = new Object();
o.name = name;
o.age= age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var friend = new friend("Why",22,"Software Engineer");
friend.sayName();

穩妥構造函數模式
與寄生構造函數的區別:一是新創建對象的實例方法不引用this,二是不適用new 操作符調用構造函數
function Person(name,age,job){
var o = new Object();
//可以在這裏定義私有變量和函數
o.sayName = function(){
alert(name);
};
return o;
}
22、
關於原型
23、
JavaScript中最常用的繼承模式:組合繼承,它融合了原型鏈和構造函數的優點。
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
alert(this.age);
};
24、寄生組合式繼承--------------還需要進一步理解
25、如果閉包的作用域鏈中保存着一個html元素,那麼就意味着該元素將無法被銷燬
26、
JavaScript沒有塊級作用域
如圖,在一般java等語言中,變量i只會在for循環語句塊中有定義,循環結束i就銷燬了。但是在JavaScript中,變量i是定義在整個函數的活動對象中的。因此從它有定義開始,就可以在函數內部隨處訪問,即使重複聲明同一個變量,也闊以。不過可以用匿名函數來模仿塊級作用域。
27、
私有作用域,示例:
(function(){
var now = new Date();
if(now.getMonth()==0 && now.getDate()==1){
alert("Happy New Year!");
}
})();
把上面這段代碼放在全局作用域中,用來向用戶祝賀新年快樂。變量now是匿名函數的局部變量,不必在全局作用域創建它。
28、
靜態私有變量,注意MyObject聲明爲全局變量的關鍵之處。
29、
模塊模式 和 增強的模塊模式    -------還需要進一步深入理解。
30、遞歸函數應該始終使用arguments.callee來遞歸地調用自身,不要使用函數名——因爲函數名可能發生變化。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
額 圖片直接複製不可以,先在Evernote裏存着了==
發佈了131 篇原創文章 · 獲贊 33 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章