国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript 函數四種調用模式

2019-11-06 06:04:38
字體:
來源:轉載
供稿:網友

函數有四種形態

-> 函數形態-> 方法形態-> 構造器形態-> 上下文形態(call, apply)

函數的四種調用模式

所有的 this 都是由當前函數決定,最終都是由函數的四種調用模式決定的。① 函數調用模式,只會執行一段代碼,同時函數中的 this 是全局對象 window;返回值由return語句決定,如果沒有return語句就表示沒有返回值
function f1(){    console.log(this);}f1();//windowfunction f2(){    return function(){        console.log(this);    }}var f2n=f2();f2n();//this——>window,這也是一次函數調用模式function f3(){    f3n();//函數調用模式——————>window    function f3n(){        console.log(this);    }}f3();// window② 方法調用模式,只會執行一段代碼,同時方法中的 this 是方法的所有者,即當前的實例對象;返回值由 return 語句決定
//代碼1:var obj={    age:10,    say:function(){        console.log(this.age);    }};obj.say();//方法調用模式//代碼2:function f1(){    console.log(this);}var obj2={    s1:f1//將f1函數賦值給obj2.s1屬性};obj2.s1();//方法調用模式——>this:obj2//代碼3:var obj3={    age:10,    s1:function(){        console.log(this.age);    }};var obj4={    age:20,    s2:obj3.s1//將obj3.s1函數賦值給s2屬性};obj4.s2();//方法調用模式:this——>obj4③ 構造器調用模式,會用來創建一個對象,還是執行一段代碼,this 表示當前對象返回值:   a. 沒有手動添加返回值,默認返回 this   b. 返回了一個基本數據類型(number / boolean / string / null / undefined),最終返回 this   c. 返回了一個復雜數據類型(對象),最終返回該對象
//代碼1:function Person(){    this.age=20;    this.name="張三";    console.log(this);}//構造函數調用模式:var p1=new Person();//代碼2;function P2(){    this.age=18;    return "abc";}var p2=new P2();//p2.age=18//代碼3:function P3(){    this.age=10;    return {};}var p3=new P3();//p3.age:undefinedconsole.log("p3.age");console.log(p3.age);//代碼4:function P4(){    this.age=10;    return [1,3,5];}var p4=new P4();//p4.age:undefinedconsole.log("p4.age");console.log(p4.age);④ 上下文調用模式,可以用參數來控制 this 的含義語法:        函數.call(對象,參數列表)        函數.apply(對象,參數數組)        call 和 apply 除了參數不同,功能完全相同this :    a. 傳遞一個 null / undefined ,this 指向 window    b. 傳遞一個 數字 / 字符串 / 布爾值,this 指向 對應的基本包裝類型的對象(Number / String / Boolean)    c. 傳遞一個 對象:this 指向該對象返回值:由 return 語句決定例如調用 函數 func 需要兩個參數func( 1, 2 )那么使用上下文調用的語法是func.call(obj, 1, 2);func.apply(obj, [1, 2]);apply 方法就是為了處理偽數組借用函數調用p.sayHello => p.sayHello.call(p)    p.sayHello.apply(p)
function f1(){    console.log(this);}//上下文模式f1.call(null);//windowf1.call(undefined);//windowf1.call(1);//Number的實例f1.call("abc");//String的實例f1.call(true);//Boolean的實例var s1="abc";console.log(s1.length);//3console.log(s1[0]);//"a"//代碼內部創建了字符串所對應的String構造函數的實例//{0:"a",1:"b",2:"c",length:3}//代碼執行完畢之后,就會把這個實例給銷毀練習題1:
function f1(){    this.length=5;    return function(a,b,c){        this.length=10;        return [1,3,5];    }}//構造函數調用模式:var r1=new f1();//r1是函數console.log(r1.length);//任何函數都有一個length屬性表示形參的個數:3//函數調用模式var r2=r1();//r2:[1,3,5]console.log(r2.length);//3//構造函數調用模式var r3=new r1();//r3:[1,3,5]console.log(r3.length);//3練習題2:
var length = 10;function fn() {    console.log(this.length);}var obj = {    length: 5,    method: function (f) {        f();//f變量的值是fn函數,但是這里是函數調用模式--->this:window————>window.length:10        arguments[0]();//方法調用模式,this:arguments——>arguments.length:2    }}obj.method(fn, 1);var o1={    0:function(){    },    say:function(){    }};o1[0]();//o1.0();//錯誤o1.say();o1["say"]();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内江市| 泗水县| 威海市| 邢台市| 靖安县| 华宁县| 青冈县| 罗平县| 和顺县| 定州市| 临沂市| 遂平县| 嘉鱼县| 镇远县| 沾益县| 浮梁县| 石林| 柳江县| 房山区| 多伦县| 鹤壁市| 兴义市| 尤溪县| 柘荣县| 乳山市| 望江县| 太湖县| 天气| 中卫市| 彰化市| 铜梁县| 陕西省| 象山县| 苗栗市| 武城县| 福海县| 峨山| 沐川县| 广宁县| 蒙山县| 海林市|