58-65

JS函數

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

JS序列化以及轉義

序列化數組

enter description here

上圖:
設置一個列表;經過JSON.stringify(li)將數組轉成字符串;
經過JSON.parse將一個字符串轉成數組。瀏覽器

enter description here

上圖:
將query= 後面的內容經過encodeURL()轉換成百分號+字母或數字,這樣就獲得了一個轉義後的連接;
固然咱們也能夠經過decodeURL來反義緩存

enter description here

上圖:使用encodeURLComponent(url)會轉義連接先後更多的內容服務器

轉義是針對瀏覽器的cookie來使用的; 好比用戶在使用瀏覽器訪問web服務器時,一般會有一些讓服務器記住本身的緩存(cookie)操做,那麼服務器會講這些數據進行轉義,而後存放在用戶瀏覽器的本地硬盤中,下次用戶再去訪問時由於本地硬盤有相應的轉義數據,服務器會直接讀取相應的轉義數據,就不須要用戶在重新進行重複的操做了。cookie

eval

在python當中
eval能夠將字符串直接轉成python中的表達式
exec能夠直接執行代碼ide

在JS中的eval同時知足了python中的eval和exec功能函數

時間

Date類
var d = new Date() 這裏使用new表示建立一個對象; d就等於這個時間

enter description here

上圖:將時間賦值給d

enter description here

上圖:d. 有不少屬性能夠調用,好比小時、分鐘、秒等等。

enter description here

上圖:獲取當前那分鐘; 獲取數據就使用get

enter description here

上圖:將獲取的分鐘數 + 10

enter description here

上圖:使用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);
    }

這個函數尚未被調用,但已經被編譯了

函數的做用域存在做用域鏈,而且也是在被調用以前就建立

  • 示例1
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()

代碼:報錯,由於沒法調用做用域外面的變量

  • 示例2
xo = "alex";

function func(){
    var xo = 'eric';
    function inner(){

        console.log(xo);
    }

    return inner;
}

var ret = func()
ret() <!--這裏至關於執行了inner函數,打印xo的值是'eric'-->
  • 示例3
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'。

JS面向對象以及原型

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()時,都只會去原型中調用,這樣就節省了內存資源。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息