[劉陽Java]_步步窺探JS變量做用域

今天的這個文章題目名稱甚是讓人會突發異想。JS變量做用域是務必須要搞懂的,單從面試過程就會讓面試者燒腦袋。因此,咱們仍是寫一篇關於JS變量做用域的技術專題,讓全部小夥伴可以藉此文章去整理JS的基礎學習。說不定不少人會比我理解這方面基礎知識有更好地看法javascript

黃金守則第一條: JS沒有塊級做用域(你能夠本身閉包或其餘方法實現)只有函數級做用域,函數外面的變量函數裏面能夠找到,函數裏面的變量外面找不到html

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
	var a = 10;
	function m01() {
		alert(a);
	}
	function m02() { // 嘗試經過m02方法去改變變量a的值
		var a = 20;
		m01();
	}
	m02();
  </script>
 </head>
 <body>
 </body>
</html>

  

黃金守則第一條原理:由於在方法m02裏面定義變量a是局部變量,它不會影響最外面的var a = 10; 的值java

黃金守則第二條:在函數裏面定義變量 var a = b = 10; 其實a是局部變量,b是全局變量。此程序的坑實在是難以讓程序員們接受程序員

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
	function m01() {
		var a = b = 10;	
	}
	m01();
	// alert(a); 運行這段代碼就報錯; Uncaught ReferenceError: a is not defined
	alert(b);
  </script>
 </head>
 <body>
 </body>
</html>

黃金守則第三條:變量的查找是就近原則,去尋找var定義的變量,當就近沒有找到的時候就去查找外層。面試

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
  	var a = 10;
	function m01() {
		alert(a);
		var a = 20;
	}
	m01();
  </script>
 </head>
 <body>
 </body>
</html>

==============================================================閉包

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
  	var a = 10;
	function m01() {
		alert(a);
		a = 20;
	}
	m01();
  </script>
 </head>
 <body>
 </body>
</html>

======================================================函數

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
  	var a = 10;
	function m01() {
		m02();
		alert(a);
		function m02() {
			var a = 20;
		}
	}
	m01();
  </script>
 </head>
 <body>
 </body>
</html>

這段代碼有些意思,爲何會輸出10。由於,在alert(a)的時候,bbb函數中的a確實爲20 ,但是它對於這時的alert(a)這句話來講是局部的,alert(a)根本找不到bbb函數中的a,因此在aaa函數中它找不到a,因而乎去外面找,一找,就找到了10學習

黃金守則第四條:當參數跟局部變量重名時,優先級是等同的。spa

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
  	var a = 10;
	function m01(a) {
		a += 3;
	}
	m01(a);
	alert(a);
  </script>
 </head>
 <body>
 </body>
</html>

=============================================================3d

參數是基本類型,只傳了值進去,下面的傳個引用類型

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
  	var a = [1,2,3];
	function m01(a) {
		a = [1,2,3,4];
	}
	m01(a);
	alert(a);
  </script>
 </head>
 <body>
 </body>
</html>

==========================================================

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script>
  	var a = [1,2,3];
	function m01(a) {
		a.push(4);
	}
	m01(a);
	alert(a);
  </script>
 </head>
 <body>
 </body>
</html>

相關文章
相關標籤/搜索