Function-JS

函數表達式能夠包含名稱,例:javascript

var f=function factorial(x){if(x<=1)return 1;else return x*factorial(x-1);}java

中,factorial這個函數對象的名稱包含在函數做用域中,成爲該函數的局部變量。函數

 

函數聲明與函數字面量建立函數最大的不一樣是:函數聲明會提早預加載,即函數聲明語句被提早到外部腳本或外部函數做用域的頂部。一樣以var 定義的變量也會預加載。spa

預加載:JS代碼在運行前都要進行預加載,目的是事先構造運行環境例如全局環境、函數運行環境、構造做用域鏈,而環境和做用域的構造的核心內容就是指定好變量屬於哪一個範疇,所以在JS中變量的定義是在預加載完成而非在運行期間。prototype

 

函數中的參數分別形參和實參,形參能夠想像成保存在函數的內部,即與函數一塊兒保存在堆中,而實參則保存在棧中,形參與實參的引用是對實參值的複製,若是實參是對像,則是對實參值即指向地址的複製。code

 function testFtn(sNm,pObj){

        console.log(sNm);// 運行結果:new Name

        console.log(pObj.oName);// 運行結果:new obj

        sNm = "change name";

        pObj.oName = "change obj";

    }

    var sNm = "new Name";

    var pObj = {oName:"new obj"};

    testFtn(sNm,pObj);

    console.log(sNm);// 運行結果:new Name

    console.log(pObj.oName);// 運行結果:change obj
複製代碼

 

var p=null;
var o=Object.create(null);
typeof p;//"object"
typeof o;//"object"
p instanceof Object;//false
o instanceof Object;//false

  p與o同樣都不具備原形屬性。p!==o,p!=o,說明這兩種方法所得的p與o是不相同的。對象

 

1 function inherite(p){
2     if(p===null) throw TypeError();
3     if(Object.create)return Object.create(p);
4     if(typeof p!=='object'&&typeof p!=='function') throw TypeError();
5     function f(){};
6     f.prototype=p;
7     return new f();      
8 }

注:1.Object.create()的第一個參數是原型對象。Object prototype may only be an object or null.因此p必須是一個對象或者是null,才能夠用該方法。blog

      2.具備prototype屬性的必須是一個函數。即f.prototype=p。ip

 

 

 

 

1作用域

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息