JS函數分爲三類html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> <!--普通函數--> function f(arg) { return arg+1 } setInterval("f()",5000) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> <!--匿名函數--> setInterval(function () { console.log(123); },5000) </script> </body> </html>
代碼:匿名函數沒有函數名,能夠經過setInterval來定時執行python
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> <!--自執行函數--> (function (arg) { console.log(arg); })(1) </script> </body> </html>
代碼:建立並自動執行函數; 當程序執行時,這一類的函數會自動執行,沒有函數名,也不須要主動去調用。web
序列化數組
上圖:
設置一個列表;經過JSON.stringify(li)將數組轉成字符串;
經過JSON.parse將一個字符串轉成數組。瀏覽器
上圖:
將query= 後面的內容經過encodeURL()轉換成百分號+字母或數字,這樣就獲得了一個轉義後的連接;
固然咱們也能夠經過decodeURL來反義緩存
上圖:使用encodeURLComponent(url)會轉義連接先後更多的內容服務器
轉義是針對瀏覽器的cookie來使用的; 好比用戶在使用瀏覽器訪問web服務器時,一般會有一些讓服務器記住本身的緩存(cookie)操做,那麼服務器會講這些數據進行轉義,而後存放在用戶瀏覽器的本地硬盤中,下次用戶再去訪問時由於本地硬盤有相應的轉義數據,服務器會直接讀取相應的轉義數據,就不須要用戶在重新進行重複的操做了。cookie
在python當中
eval能夠將字符串直接轉成python中的表達式
exec能夠直接執行代碼ide
在JS中的eval同時知足了python中的eval和exec功能函數
Date類
var d = new Date() 這裏使用new表示建立一個對象; d就等於這個時間
上圖:將時間賦值給d
上圖:d. 有不少屬性能夠調用,好比小時、分鐘、秒等等。
上圖:獲取當前那分鐘; 獲取數據就使用get
上圖:將獲取的分鐘數 + 10
上圖:使用set進行設置;將d這個時間的分鐘數設置爲n的值(30); 圖中能夠看到分鐘數變成30了。
以函數做爲做用域 (let)
其餘語言: 以代碼塊做爲做用域(大括號以內屬於一個做用域) public void Func(){ if(1==1){ string name = 'Java'; } console.writeline(name); } Func() // 報錯 Python: 以函數做爲做用域 狀況一: def func(): if 1==1: name = 'alex' print(name) func() // 成功 狀況二: def func(): if 1==1: name = 'alex' print(name) func() print(name) // 報錯 JavaScript: 以函數做爲做用域 function func(){ if(1==1){ var name = 'alex'; } console.log(name); } func()
函數的做用域在函數未被調用以前就已經建立
function func(){ if(1==1){ var name = 'alex'; } console.log(name); }
這個函數尚未被調用,但已經被編譯了
函數的做用域存在做用域鏈,而且也是在被調用以前就建立
xo = "alex"; function func(){ var xo = 'eric'; function inner(){ var xo = 'tony'; <!--當前調用這裏的xo變量--> console.log(xo); } inner() } func()
代碼:
函數嵌套函數就叫作做用域鏈;
xo = "alex"; function func(){ var xo = 'eric'; <!--當前調用這裏的xo變量--> function inner(){ // var xo = 'tony'; <!--這裏註釋掉--> console.log(xo); } inner() } func()
xo = "alex"; function func(){ var xo = 'eric'; <!--這裏註釋掉--> function inner(){ // var xo = 'tony'; <!--這裏註釋掉--> console.log(xo); } inner() } func()
代碼:報錯,由於沒法調用做用域外面的變量
xo = "alex"; function func(){ var xo = 'eric'; function inner(){ console.log(xo); } return inner; } var ret = func() ret() <!--這裏至關於執行了inner函數,打印xo的值是'eric'-->
xo = "alex"; function func(){ var xo = 'eric'; function inner(){ console.log(xo); } var xo = 'tony'; return inner; } var ret = func() ret()
代碼:
打印xo的結果是tony;
從上到下 xo = 'eric',而後到達inner函數,可是當前這裏並無調用inner函數,而後xo又被從新賦值爲'tony',最後ret()被調用時 xo已經被從新賦值爲'tony'了,因此這裏打印的是'tony'。
function func(){ console.log(xo); } func(); // xo這個變量不存在,程序直接報錯 function func(){ console.log(xo); var xo = 'panda'; } 解釋過程當中:var xo; func(); // 代碼從上到下執行,但在執行前會先獲取全部變量,並定義爲undefined,因此在先執行console.log(xo)時會先看到打印的是undefined;緊接着在往下執行代碼var xo = 'alex',這時至關於xo這個變量給賦值爲'panda'; 若是下面代碼再次console.log(xo)的話,name此時打印的就是'panda'。
function FOO(n){ this.name = n; <!--this相似python中的self--> this.sayName = function(){ console.log(this.name) } } var obj1 = new Foo('we'); <!--使用new建立一個叫obj的對象--> obj1.name <!--'we'傳入到面向對象中,因此name等於'we'--> obj1.sayName <!--這裏至關於調用對象中的函數,函數中打印了name-->
function FOO(n){ this.name = n; this.sayName = function(){ console.log(this.name) } } var obj1 = new Foo('we'); obj1.name obj1.sayName var obj2 = new Foo('you'); obj2.name obj2.sayName <!--咱們建立了第2個對象,每一個對象在內存中都會單獨佔用一份空間,這樣就浪費了內存資源-->
function Foo(n){ this.name = n; } # Foo的原型 Foo.prototype = { 'sayName': function(){ console.log(this.name) } } obj1 = new Foo('we'); obj1.sayName() obj2 = new Foo('you');
代碼:建立了一個Foo類;在使用Foo類建立一個原型,這個原型在內存中只存在一個;當咱們調用類中的sayName()方法時,都會去到這個類中的原型中去找,內存中只有一個原型;這樣無論咱們建立多少個對象去調用sayName()時,都只會去原型中調用,這樣就節省了內存資源。