Javascript高階程式設計學習筆記(七)

2021-08-28 14:19:45 字數 3879 閱讀 3351

函式法一

函式宣告

function functionname(arg0,arg1,arg2)

alert(functionname.name);//functionname,只在firefox,safri,chrome和opero有效

函式宣告提公升,在執行**前先讀取函式宣告

sayhi();

function sayhi()

//不會丟擲錯誤,在**執行前會先讀取函式宣告

法二使用建立函式的方式使用函式表示式

var functionname=function(arg0,arg1,arg2)

//函式表示式和其他表示式一樣,在使用前必須賦值。

sayhi();//錯誤,函式不存在

var sayhi=function();

遞迴;遞迴函式是在乙個函式通過名字呼叫自身的情況下構成的

function factorial(num)else

}使用argument.callee是乙個指向正在執行的函式的指標,因此可以用他來實現對函式的遞迴呼叫

function factorial(num)else

}在嚴格模式下使用這種方式進行遞迴呼叫最為規範

var factorial=(function f(num)else

});//即便把函式值賦給另乙個變數,函式的名字f仍然有效。

閉包閉包是指有許可權訪問另乙個函式作用域的變數的函式,

建立閉包的常見方式就是在乙個函式內部建立另乙個函式,

就是內部函式,

function createfunctions();

}return result;

}//每個函式都會返回10,因為每個函式的作用域鏈中

都儲存著createfunctions()函式的活動物件。所以他們引用的都是同乙個變數i.

當createfunctions()函式返回後,變數i的值是10;

//使用匿名函式強制讓閉包的行為符合預期

function createfunctions();

}(i);

return result;

}//返回0,1,2,3,4,5,6,7,8,9

關於this物件;

this物件是在基於函式的執行環境繫結的,在全域性函式中,this等於window,

而當函式被作為某個物件的方法呼叫時,

this等於那個物件。匿名函式的執行具有全域性性,因此其this物件通常指向window.

例如var name="the window";

var object=;}};

alert(object.getnamefunc()());//"the window"

下例中把this物件賦給了that變數。that變數按照作用域鏈便會返回my object

var name="the window";

var object=;}};

alert(object.getnamefunc()());//my object;

在幾種特殊的情況下,this的只會意外的改變

var name="the window";

var object=;

object.getname{};//"my object"

{}//"my object"

記憶體洩漏

function assignhandler();

element=null;

}//如果閉包的作用域鏈中儲存著乙個html元素,則意味著該元素無法被銷毀。(此**中已銷毀)

//閉包會引用包含函式的整個活動物件,其中包含著

element.即使閉包不直接引用element,包含函式的活動物件中

也仍然會儲存乙個引用。因此,有必要把element變數設定為null.

這樣就能解除對dom物件的引用,確保正常**其占用的記憶體。

模仿塊級作用域

function outpnumbers(count)){};

法二var somef=function();

somef();

法三(function())();

臨時需要一些變數可以使用私有作用域,例如

function outpnumbers(count)

//sum num1,num2都是私有變數。

有權訪問私有變數和私有函式的工有方法稱為特權方法。

法一:在建構函式中定義特權方法

function myobject()

//特權方法

this.pm=function();

}用私有和特權成員可以隱藏那些不應該被直接修改的資料

function per(name);

this.setname=function(value);

}var per=new per("nicholas");

alert(per.getname());//"nicholas"

person.setname("greg");

alert(per.getname());//"greg"

//建構函式缺點:每個例項都會建立同樣一組新方法

靜態私有變數

1.函式宣告只能建立區域性函式。

通過在私有作用域中定義私有變數或函式,建立特權方法

使用函式表示式的方式 

(function()

//建構函式

myobject=function();

//公有/特權方法

myobject.prototype.publicmethod=founction();

})();

//初始化未經宣告的變數,總是會建立乙個全域性變數

故myobject就成了乙個全域性變數。能夠在私有作用域外被

訪問到。

(function();

person.prototype.getname=function();

person.prototype.setname=function(value);

})();

var person1=new person("nicholas");

alert(person1.getname());//"nicholas"

person1.setname("greg");

alert(person1.getname());//"greg"

var person2=new person("michael");

alert(person1.getname());//"michael"

alert(person2.getname());//"michael"

模組模式

為單例建立私有變數和特權方法

var singleton=function()

//特權/公有方法和屬性

return

};}();

//將乙個物件字面量作為函式的值返回,返回的物件字面量中只包含可以公開的的屬性和方法。因此他的公有方法有權訪問私有變數和函式,由於這個物件是在匿名函式內部定義的,

從本質上來講,這個物件字面量定義的是單例的公共介面。

//即:如果必須建立乙個物件並以某些資料對其初始化,同時還要公開一些

能夠訪問這些私有資料的方法。

增強的模組模式

//增強的模組模式適合那些單例必須是某種型別的例項,同時還必須

新增某些屬性和(或)方法對其加入以增強的情況。

var  singleton=function()

//建立物件

var object=new customtype();

//新增特權/公有屬性和方法

object.publicproperty=true;

object.pubicmethod=function();

//返回這個物件

return object;

}();

JavaScript高階程式設計

ecmascript有5種基本型別資料 另外還有一種複雜的資料型別 typeof就是用來檢測變數的資料型別的,typeof可能會返回以下值 typeof操作符在檢測引用型別的值時,總是會返回object,所以用處不大。instanceof用來檢測物件型別的,返回值是 true false。例如 pe...

JavaScript高階程式設計 this

在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了 因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件...

javascript 高階程式設計 二

這裡我們直接進入主題 在js剛剛開始的時候,必須面臨乙個問題,那就是如何使的js的載入和執行不會影響web核心語言html的展示效果,和html和諧共存。在這個背景下 2 xhtml中的應用 在html中如果字串,那麼html就會認為js指令碼已經結束所以會產生乙個錯誤用一下 來替換 來替換aler...