JS高級特性(一)

一、函數

1、如何定義函數

<!DOCTYPE html>
<html>
  <head>
    <title>01_如何定義函數.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	//1 普通方式
	function add(a,b){
		return a + b;
	}
	
	//2 直接量方式
	var add = function(a,b){
		return a + b;
	}
	
	//3 構造函數方式(在javascript裏,底層提供Function對象)
	var add = new Function('a','b','return a+b;');
	
	//javascript中不存在類的概念,只有對象的概念
	
  </script>
</html>

2、Arguments對象

<!DOCTYPE html>
<html>
  <head>
    <title>02_Arguments 對象.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	/*
  	 * Java中具有函數重載:
  	 * 	* 節省了函數的命名空間
  	 * 	* 代碼更加簡單
  	 * 	* 重載的性能更好
  	 * 
  	 * javascript也想實現函數的重載?沒有
  	 * 	* 在javascript中定義多個同名的函數,只有最後一個定義的函數起作用
  	 * 	* NaN:表示不是一個數值的內容(不存在的值)
  	 * Arguments對象:
  	 * 	* Arguments對象是數組對象
  	 * 	* 利用Arguments對象的length屬性,獲取參數的個數
  	 * 	* 利用Arguments對象的特性,模擬函數重載的效果?可以
  	 */
//	function add(a,b){
//		return a+b;
//	}
//	function add(a,b,c){
//		return a+b+c;
//	}
//	
//	alert(add(1,2));		//output	3	NaN
//	alert(add(1,2,3));		//output	6
	
//	function fn(){
//		alert(arguments.length);
//	}
//	
//	fn();				//output	0
//	fn("a");			//output	1
//	fn("a","b");		//output	2
//	fn("a","b","c");	//output	3
	
	function add(){
		if(arguments.length==2){
			return arguments[0] + arguments[1];
		}else if(arguments.length==3){
			return arguments[0] + arguments[1] + arguments[2];
		}
	}
	
	alert(add(1,2));		//output	3
	alert(add(1,2,3));		//output	6
	
  </script>
</html>

3、變量的作用域

<!DOCTYPE html>
<html>
  <head>
    <title>03_變量的作用域.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	/*
  	 * 變量的作用域:
  	 * 	* javascript中存在(變量)
  	 * 		* 全局變量:全局域
  	 * 		* 局部變量:當前局部域(函數域)
  	 * 	* javascript中存在(域)
  	 * 		* 全局域
  	 * 		* 函數域(局部域)
  	 */
//	var a = "a";
//	
//	function fn(){
//		var b = "b";
//		
//		alert(a);		//output	a
//		alert(b);		//output	b
//	}
//	
//	fn();
//	alert(a);			//output	a
//	alert(b);			//output	undefind
	
	/*
	 * 定義局部變量時,不使用"var"修飾符:
	 * 	* javascript語法上支持這種寫法
	 * 	* 局部變量b被定義出來
	 * 	* javascript會自動將局部變量b定義爲全局變量
	 * 在實際開發中,不建議這樣編寫:
	 * 	* 編碼不規範
	 */
//	var a = "a";
//	
//	function fn(){
//		b = "b";
//		
//		alert(a);		//output	a
//		alert(b);		//output	b
//	}
//	
//	fn();
//	alert(a);			//output	a
//	alert(b);			//output	b
	
	/*
	 * 在javascript中,定義全局變量與局部變量同名時:
	 * 	* 在函數域中,只能訪問到局部變量
	 * 
	 * 解讀代碼(代碼的執行情況):
	 * 	* 定義一個全局變量a,並初始化爲a(存在並且有值)
	 * 	* 定義一個函數fn()(而不執行的時候)
	 * 		* 局部變量a被定義,並沒有初始化(存在但是沒值)
	 * 	* 調用函數fn()
	 * 		* 第一次打印變量a,是局部變量a,結果爲undefind
	 * 		* 第二次打印變量a,是局部變量a,結果爲b
	 * 	* 在全局域中,訪問變量a,只能是全局變量a
	 */
	var a = "a";
	
	function fn(){
		alert(a);		//output	undefind
		
		var a = "b";
		
		alert(a);		//output	b
	}
	
	fn();
	alert(a);			//output	a
	
  </script>
<h3></html></h3>

4、幾種特殊的函數

<!DOCTYPE html>
<html>
  <head>
    <title>04_幾種特殊的函數.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	/*
  	 * 1 匿名函數:沒有名的函數
  	 * 	* (匿名回調函數)可以將匿名函數作爲參數傳遞給其他函數。這樣,接收方函數就能利用所傳遞的函數來完成某些事情。
  	 * 	* (自調函數)可以定義某個匿名函數來執行某些一次性任務。
  	 */
	//function(){}
	
	/*
	 * 這種情況下,函數one和two,稱之爲叫做回調函數
	 * 	* 定義:將一個函數作爲另一個函數的參數,而作爲參數的函數就叫做回調函數
	 * 將匿名函數作爲參數:匿名回調函數
	 * 	* 定義: 將一個匿名函數作爲另一個函數的參數,而作爲參數的匿名函數就叫做匿名回調函數
	 */
//	var one = function(){return 1;}
//	var two = function(){return 2;}
	
	//函數fn()的參數a,b是參數函數
//	function fn(a,b){
//		return a() + b();
//	}
//	
//	//alert(fn(one,two));			//output	3
//	//以上寫法是否可以改寫?
//	alert(fn(function(){return 1;},function(){return 2;}));		//output	3
	
	/*
	 * 一次性任務:函數只被調用一次
	 * 	* 實現頁面初始化工作的函數(不嚴格)
	 * 	* 定義即調用的函數(不嚴格)
	 * 	* 自調函數:自己調用自己
	 * 		* 第一個小括號:封裝函數
	 * 		* 第二個小括號:調用函數(傳參)
	 */
//	(
//		function(){
//			alert("javascript");
//		}
//	)();
	
//	(
//		function(str){
//			alert(str+" javascript");
//		}
//	)("hello");
	
  </script>
</html>
<!DOCTYPE html>
<html>
  <head>
    <title>04_幾種特殊函數.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	/*
  	 * 內部(私有)函數(Java裏內部類)
  	 * 	* 保證了私有性 —— 外部不能訪問不到(提供了安全性)
  	 */
//	function fn(){
//		var a = "a";
//		
//		function n(){
//			var b = "b";
//			
//			alert(a+b);		//output	ab
//		}
//		
//		return n();
//	}
//	
//	fn();		//output	ab
	
	/*
	 * (瞭解)返回函數的函數(內部函數的一種特殊用法)
	 * 	* 可以在全局域中,訪問到局部變量的值
	 * 	* 定義一個函數時,最終執行兩個邏輯代碼塊
	 */
	function fn(){
		//邏輯代碼塊
		var a = "a";
		
		return function(){
			//邏輯代碼塊
			return a;
		}
	}
	
	alert(fn());			//output	function(){return a;}
	
	//var fun = fn();
	//var fun = function(){return a;}
	
	//alert(fun());			//output	a
	
	alert(fn()());			//output	a
	
	/*
	 * javascript中的特殊函數,不是必要使用的內容
	 * 	* 第一次完成實現邏輯內容時,很少會用到特殊函數
	 * 	* 在做代碼優化的時候,會使用特殊函數
	 * 
	 * 代碼實現:一次性做到代碼最優
	 * 	* 實現邏輯內容
	 * 	* 代碼優化
	 */
	
  </script>
</html>

二、閉包

1、作用域鏈

<!DOCTYPE html>
<html>
  <head>
    <title>01_作用域鏈.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	
	var a = "a";
	
	function fn(){
		var b = "b";
		
		alert(a);			//output	a
		alert(b);			//output	b
		
		function n(){
			var c = "c";
			
			alert(a);		//output	a
			alert(b);		//output	b
			alert(c);		//output	c
		}
		
		return n();
	}
	
	fn();
	
  </script>
</html>

2、閉包

<!DOCTYPE html>
<html>
  <head>
    <title>02_閉包.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	
	var a = "a";
	var n;
	function fn(){
		var b = "b";
		
		alert(a);			//output	a
		alert(b);			//output	b
		
		//變量定義,初始化
		n = function(){
			var c = "c";
			
			alert(a);		//output	a
			alert(b);		//output	b
			alert(c);		//output	c
		}
		
		return n();
	}
	
	//fn();
	n();
	
  </script>
</html>

3、循環中的閉包結構

<!DOCTYPE html>
<html>
  <head>
    <title>03_循環中的閉包結構.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my HTML page. <br>
  </body>
  <script type="text/javascript">
  	/*
  	 * * 定義了一個函數f()
  	 * 		* 定義了一個空的數組a
  	 * 		* 定義了一個局部變量i,沒有初始化
  	 * 		* 遍歷:
  	 * 			* 初始化局部變量i:0,1,2,3
  	 * 			* 初始化數組a:a[0],a[1],a[2] - function(){return i;}
  	 * 		* 返回值爲數組a
  	 * 	* 定義一個全局變量fun,初始化爲函數f()的調用(數組a)
  	 * 	* 調用全局變量fun
  	 */
//	function f(){
//		var a = [];
//		var i;
//		for(i = 0; i < 3; i++){
//			a[i] = function(){
//				return i;
//			}
//		}
//		return a;
//	}
//	
//	var fun = f();
//	
//	alert(fun[0]());		//output	3
//	alert(fun[1]());		//output	3
//	alert(fun[2]());		//output	3

//	function f(){
//		var a = [];
//		var i;
//		for(i = 0; i < 3; i++){
//			a[i] = (
//				function(x){
//					return x;
//				}
//			)(i);
//		}
//		return a;
//	}
//	
//	var fun = f();
//	
//	alert(fun[0]);		//output	0
//	alert(fun[1]);		//output	1
//	alert(fun[2]);		//output	2
	
//	function f(){
//		var a = [];
//		var i;
//		function n(x){
//			return x;
//		}
//		for(i = 0; i < 3; i++){
//			a[i] = n(i);
//		}
//		return a;
//	}
//	
//	var fun = f();
//	
//	alert(fun[0]);		//output	0
//	alert(fun[1]);		//output	1
//	alert(fun[2]);		//output	2
	
	function f(){
		var a = [];
		var i;
		for(i = 0; i < 3; i++){
			a[i] = i;
		}
		return a;
	}
	
	var fun = f();
	
	alert(fun[0]);		//output	0
	alert(fun[1]);		//output	1
	alert(fun[2]);		//output	2
	
  </script>
</html>






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章