函式宣告具有宣告提前/宣告提公升的特性,這一點和變數的宣告特性相似,執行**之前會先讀取函式宣告和變數宣告,意味著可以把函式宣告放在呼叫它的語句後面,但變數宣告肯定最好不要這樣,因為常伴隨undefined問題。
函式宣告的函式名稱和函式體都提前,而函式表示式只是變數宣告提前(而變數的初始化**仍然在原來的位置)。
構成函式主體的**定義時並不會執行,呼叫函式時才會執行,有4中方式呼叫函式:
①作為函式呼叫的注意點,嚴格模式下呼叫上下文是undefined,所以通常不使用this關鍵字,②作為方法呼叫的話呼叫上下文就是方法所在的物件,this關鍵字引用著該物件。③而巢狀函式不會從呼叫它的函式中繼承this,如果想訪問外部的this,可以用變數儲存this的值。④構造函式呼叫會使用新建立的物件作為呼叫上下文。
當傳入的實參比函式宣告時指定的形參數量要少,剩下的形參都將設定為undefined值(實參多則會自動省略)。所以在合適的場景就可以選擇使用可選形參:
function getpropertynames(o, /* optional */ a)
var arr = [1,2];
//[1, 2, "x", "y"]
console.log(getpropertynames(,arr));
//["x", "y"]
console.log(getpropertynames());
注意點:需要將可選形參放在形參列表的最後,並在函式定義是使用注釋強調形參是可選的。
在函式體內,識別符號arguments是指向實參物件的引用,它是乙個類陣列物件,可以通過數字下標訪問傳入的實參值,這樣函式就可以操作任意數量的實參:
function getmaxvalue(/* ... */)
}return max;
}console.log(getmaxvalue(4,2,1,8,10));//10
//階乘
function factorial(n)
else return nan;
}factorial[1] = 1;
console.log(factorial([5]));//120
為了不汙染全域性空間,常用定義匿名函式並立即在單個表示式中呼叫的方式:
var extendfun = (function () ());
call除了第乙個引數之後的引數就是要傳給函式的值:
function logmsg(x,y,z)
//列印2/4/6
logmsg.call({},2,4,6);
function logmsg(x,y,z)
//列印8/10/12
function logmsg(x,y,z)這個方法主要作用是將函式繫結至某個物件,除了第乙個實參以外,其他的實參會傳入到函式裡面:function wanttolog(a,b,c)
//列印1/2/3/4
wanttolog(1,2,3);
function f(y,z)
var g = f.bind(,4);
console.log(g(2));//3+4+2=9
//這裡面繫結了this和y
關於軟體測試的知識要點
最近為小舅子找工作出謀劃策,他的目標是軟體測試工程師。匆忙中給他做了一次模擬面試,面試中不小心也為自己整理了一下軟體測試方面的理解。遺憾的是我從來也沒有真正意義上地做過測試工程師,估計近期的將來也沒有這個機會,所以趕緊把一些要點記錄下來,以免日久生疏。測試思想 質量意識 責任 站在客戶的立場 好奇心...
js知識體系的梳理一
今天簡單的總結了js的一些東西,梳理下整個體系,每一次的總結都會有不同的收穫 js總結一 一 獲取元素 1 通過id var obtn document.getelementbyid btn1 var odiv document.getelementbyid div1 2 通過標籤 var adiv...
js中 關於bom的知識
1 screentop 瀏覽器左上角到物理螢幕左上角的垂直距離 2 screenleft 瀏覽器左上角到物理螢幕左上角的水平距離 3 以上兩種 除了火狐瀏覽器不相容外,其他瀏覽器都相容,火狐瀏覽器使用screenx和screeny,其功能和上面兩種一樣 處理相容性問題 browerleft wind...