javascript基礎(函式屬性arguments,方法:call,apply)(二十)

厚積薄發2017發表於2017-02-08

1.函式屬性arguments,方法:call,apply:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			/*
			 * 除了this,在呼叫函式時,瀏覽器還傳遞了另一個隱含的引數
			 * 	還有一個引數叫做arguments
			 * 
			 * arguments是一個類陣列物件,在它裡邊儲存著函式執行時的實參
			 * 	函式的所有的實參都在arguments中儲存,
			 * 	通過arguments即使不定義形參也可以使用引數
			 * 
			 * 	屬性:
			 * 		callee
			 * 			- arguments中有一個屬性 callee,代表的是當前正在呼叫的函式物件
			 * 
			 */
			function fun(a,b,c){
				
				//Array.isArray() 可以用來檢查一個物件是否是一個陣列
				//console.log(Array.isArray(arguments));
				
				
				//獲取實參的數量
				//console.log(arguments.length);
				
				//獲取指定的實參
				//實參會儲存到arguments物件中指定的位置
				//console.log(arguments[2]);
				
				console.log(arguments.callee == fun);
			}
			
			//fun("hello",123,true);
			
			
			function fun2(a , b){
				console.log("a = "+a +" ,  b = "+b);
				//console.log(this);
			}
			
			/*
			 * 函式物件的方法:
			 * 	call
			 *  apply
			 * 		- 當呼叫函式物件的call和apply時都會導致函式立即執行,
			 * 			就相當於呼叫了函式一樣
			 * 		- 如果通過call和apply去呼叫一個函式,則call和apply中的第一個引數
			 * 			將會是函式中的this
			 * 		- 區別:
			 * 			call的引數,需要一個一個列出來
			 * 			apply的引數,需要封裝為一個陣列傳遞
			 * 
			 * 		
			 * this的不同的情況
			 * 	- 以函式形式呼叫,this是window
			 * 	- 以方法的形式呼叫,誰呼叫方法this就是誰
			 * 	- 以建構函式呼叫,this就是新建立的那個物件
			 * 	- 通過call和apply呼叫時,第一個引數會成為this
			 */
			
			var obj = {};
			
			
			//fun2(123,456);
			//在call方法中可以將實參作為call的第二個以後的引數,傳遞給函式
			//fun2.call(obj,1,2);
			
			//apply的引數不能一個一個的傳,需要儲存到一個陣列中統一傳遞
			//fun2.apply(obj , [1 , 2]);
			
			
			var obj2 = {
						
							name : "沙和尚",
							sayName : function(){
								console.log(this.name);	
							}
								
			};
			
			name = "window中的name";
			
			obj2.sayName.call(window);
			
		</script>
	</head>
	<body>
	</body>
</html>


相關文章