function f1(){ console.log(this);}f1();//windowfunction f2(){ return function(){ console.log(this); }}var f2n=f2();f2n();//this——>window,這也是一次函數(shù)調(diào)用模式function f3(){ f3n();//函數(shù)調(diào)用模式——————>window function f3n(){ console.log(this); }}f3();// window② 方法調(diào)用模式,只會執(zhí)行一段代碼,同時方法中的 this 是方法的所有者,即當(dāng)前的實例對象;返回值由 return 語句決定//代碼1:var obj={ age:10, say:function(){ console.log(this.age); }};obj.say();//方法調(diào)用模式//代碼2:function f1(){ console.log(this);}var obj2={ s1:f1//將f1函數(shù)賦值給obj2.s1屬性};obj2.s1();//方法調(diào)用模式——>this:obj2//代碼3:var obj3={ age:10, s1:function(){ console.log(this.age); }};var obj4={ age:20, s2:obj3.s1//將obj3.s1函數(shù)賦值給s2屬性};obj4.s2();//方法調(diào)用模式:this——>obj4③ 構(gòu)造器調(diào)用模式,會用來創(chuàng)建一個對象,還是執(zhí)行一段代碼,this 表示當(dāng)前對象返回值: a. 沒有手動添加返回值,默認(rèn)返回 this b. 返回了一個基本數(shù)據(jù)類型(number / boolean / string / null / undefined),最終返回 this c. 返回了一個復(fù)雜數(shù)據(jù)類型(對象),最終返回該對象//代碼1:function Person(){ this.age=20; this.name="張三"; console.log(this);}//構(gòu)造函數(shù)調(diào)用模式: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);④ 上下文調(diào)用模式,可以用參數(shù)來控制 this 的含義語法: 函數(shù).call(對象,參數(shù)列表) 函數(shù).apply(對象,參數(shù)數(shù)組) call 和 apply 除了參數(shù)不同,功能完全相同this : a. 傳遞一個 null / undefined ,this 指向 window b. 傳遞一個 數(shù)字 / 字符串 / 布爾值,this 指向 對應(yīng)的基本包裝類型的對象(Number / String / Boolean) c. 傳遞一個 對象:this 指向該對象返回值:由 return 語句決定例如調(diào)用 函數(shù) func 需要兩個參數(shù)func( 1, 2 )那么使用上下文調(diào)用的語法是func.call(obj, 1, 2);func.apply(obj, [1, 2]);apply 方法就是為了處理偽數(shù)組借用函數(shù)調(diào)用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"//代碼內(nèi)部創(chuàng)建了字符串所對應(yīng)的String構(gòu)造函數(shù)的實例//{0:"a",1:"b",2:"c",length:3}//代碼執(zhí)行完畢之后,就會把這個實例給銷毀練習(xí)題1:function f1(){ this.length=5; return function(a,b,c){ this.length=10; return [1,3,5]; }}//構(gòu)造函數(shù)調(diào)用模式:var r1=new f1();//r1是函數(shù)console.log(r1.length);//任何函數(shù)都有一個length屬性表示形參的個數(shù):3//函數(shù)調(diào)用模式var r2=r1();//r2:[1,3,5]console.log(r2.length);//3//構(gòu)造函數(shù)調(diào)用模式var r3=new r1();//r3:[1,3,5]console.log(r3.length);//3練習(xí)題2:var length = 10;function fn() { console.log(this.length);}var obj = { length: 5, method: function (f) { f();//f變量的值是fn函數(shù),但是這里是函數(shù)調(diào)用模式--->this:window————>window.length:10 arguments[0]();//方法調(diào)用模式,this:arguments——>arguments.length:2 }}obj.method(fn, 1);var o1={ 0:function(){ }, say:function(){ }};o1[0]();//o1.0();//錯誤o1.say();o1["say"]();
新聞熱點
疑難解答
圖片精選