JavaScript函數_函數範圍__區塊鏈

來源:互聯網
上載者:User

Function在JavaScript中函數是一種對象,函數名是指向對象的引用。可以用一下方式調用它

var fun = new Function(“參數”,”傳回值”,”函數體”);

因此如果出現下面這種情況,就已很好理解了。第二個函數重寫了第一個函數,可以理解為第二個對象覆蓋了第一個對象。函數名只是引用,doAdd變數改變了引用的地址。

var doAdd = new Function(“iNum”, “alert(iNum + 20)”);
var doAdd = new Function(“iNum”, “alert(iNum + 10)”);

可以使用 ‘函數名.length’ 返回參數的數量:

    //函數將輸出1    function show(num){        alert(show.length);    };
arguments

函數的一個內建屬性。arguments類似一個數組,訪問該函數的實參,實參的數目不一定等於形參

    function show(x,y,z){        alert(arguments.length);    //返回 4        alert(arguments[2]);        //返回 c        alert(show.length);         //返回 3        arguments[0] = 'f';        alert(x);                   //返回 f    };    show('a','b','c','d');
arguments.callee

返回此arguments對象所在的當前函數引用
比如,遞迴演算法時函數本身,arguments.callee表示函數本身

    //計算num的階乘        function sum(num){            if(num<=1) {                return 1;            }else{                return num*arguments.callee(num-1);            }        }           alert(sum(4));

函數的toString() 和 ValueOf()返回函數的原始碼 call apply

改變函數的範圍
二者的異同:
apply() : 接收兩個參數,一個是函數啟動並執行範圍(this),另一個是參數數組。
call() : 第一個參數與apply()方法相同,但傳遞給函數的參數必須列舉出來。

<script>    var name = "tom";    function show(){        alert("hello "+this.name);  //this必須加上,否則會成為全域變數    }    var obj = {        name:"jerry"    }    show.call(window);    show.call(obj);</script>

結果: hello tom —> hello Jerry this

JavaScript中的this與c++中的不同,this可以改變,對於函數fun(),如果用obj.fun()調用他,那麼函數fun中得this就是obj對象,但是call(),apply()可以改變函數中的this。例如:

fun.call(window);
fun.call(this); // 此時的this就是window
這時fun函數中的this變成了了window 範圍

函數A體內包含其他函數B,只有在函數A的範圍內才能調用B

    <script>        function A(){            B();            function B(){                alert("This is function B");            }        }        A();    </script>
沒有塊級範圍

if(){} 沒有封閉範圍的功能

    if(true){        var temp = "sss";    }    alert(temp);//結果是sss

for(;;){} i和內部的變數都是全域的

    for(var i=0;i<10;i++){        var temps = "for";    }    alert("i:"+i+"temps:"+temps);//結果是i:10 temps:for

在函數中變數加上var是局部變數,不加var就是全域變數。函數使用變數時,先從本地的範圍中搜尋,如果沒有搜尋到就到上一層範圍中搜素。所以,訪問局部變數要比全域變數快

PS:

1,基本類型不能加屬性(只有Object是引用)
2,基本類型儲存在棧記憶體中,參考型別儲存在堆記憶體中,基本類型的賦值時複製了整個內容,而參考型別的賦值只是地址的複製
3,所有函數的參數都是按值傳遞的,對象傳的值是地址因此外部的對象也會變化
4,instanceof 類型 判斷類型不能檢查基本類型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.