函数的四种调用模式.上下文调用.call.apply
生活随笔
收集整理的這篇文章主要介紹了
函数的四种调用模式.上下文调用.call.apply
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
閉包:函數(shù)就是一個(gè)閉包,一個(gè)封閉的作用域;
返回函數(shù),要返回多個(gè)函數(shù)就用一個(gè)對象封裝一下,立即執(zhí)行函數(shù)+return
回調(diào)函數(shù) JS動(dòng)態(tài)創(chuàng)建的DOM,不會(huì)被搜索引擎抓取,對SEO不友好.
/*window的name屬性*/function fn(){console.log(this.name);}fn.call({name:"zhangsan"});//"zhangsan"console.log();fn();//'' 打印空字符串,此時(shí)調(diào)用fn其中的的this指的是window對象,//window對象具有name屬性,值是一個(gè)空字符串
//函數(shù)的四種調(diào)用模式//上下文模式 call apply 借用的概念function foo(){}//當(dāng)foo函數(shù)聲明好了后無法確定foo函數(shù)的身份,只有在調(diào)用的時(shí)候//才能確定foo的所屬;根據(jù)foo函數(shù)的執(zhí)行情況和返回結(jié)果//js中函數(shù)由四種不同的調(diào)用方式,其中this的指向,返回值由return決定(構(gòu)造函數(shù)特殊)//1.函數(shù)調(diào)用模式foo();//本質(zhì)就是使用window對象,調(diào)用;指向window//2.方法調(diào)用模式,把函數(shù)當(dāng)做對象的方法;this指向objvar obj ={fn:function(){}};obj.fn();obj['fn']();//3構(gòu)造函數(shù)調(diào)用 將函數(shù)當(dāng)成構(gòu)造函數(shù)來調(diào)用(new);this指向構(gòu)造函數(shù)的實(shí)例functionFoot(){}newFoot();//構(gòu)造函數(shù)沒有return語句,返回的是構(gòu)造函數(shù)的實(shí)例//有return,return的內(nèi)容是一個(gè)對象,返回值是return語句的對象;如果return的是基本數(shù)據(jù)類型,那返回值//還是實(shí)例functionFoot2(){return[1,2,3];}var foot2=newFoot2();console.log(foot2.__proto__);//Array.prototype ?Array[0]//4.上下文調(diào)用模式,根據(jù)用戶傳遞的參數(shù)產(chǎn)生不同的結(jié)果 .this的值由調(diào)用者決定;//call/apply 這兩個(gè)方法都是定義在Function.prototype中的方法,這樣任何函數(shù)都能訪問到這兩個(gè)方法//調(diào)用模式,只有函數(shù)才能調(diào)用function fn(){console.log(this.name);}console.log(fn.call()===Function.prototype.call());//truefn.call({name:"zhangsan"});//zhangsan//call方法的第一個(gè)參數(shù)指的是本次調(diào)用該函數(shù)內(nèi)部this的值fn();//此時(shí)this指向window window有一個(gè)name屬性是"" 空字符串.
function foo(){console.log(this.name);return[1,2,3];}foo();//""var f1=foo.call({name:"張三"});//"張三"console.log(f1.__proto__);//上下文模式return返回值由return決定,返回值是一個(gè)數(shù)組對象 //Array.prototypevar f2=new foo();//undefinedconsole.log(f2.__proto__);//Array.prototype
/*call方法*/? ?/*以下方法使用apply使用時(shí)相同的*/function foo(){console.log(this.age);}var obj={age:18};foo.call(obj);//18 其中的this指的是objfoo.call(null);//foo函數(shù)中的this指向window//call方法的第一個(gè)參數(shù)還可以是數(shù)字,字符串,布爾值這些基本的數(shù)據(jù)類型foo.call(3);//number 數(shù)字3轉(zhuǎn)化為對應(yīng)的基本包裝類型Number類型
/*call方法*/function foo(){console.log(this.age);}var obj ={age:18};foo.call(obj);//18 其中的this指的是objfoo.call(null);//foo函數(shù)中的this指向window//call方法的第一個(gè)參數(shù)還可以是數(shù)字,字符串,布爾值這些基本的數(shù)據(jù)類型foo.call(3);//number 數(shù)字3轉(zhuǎn)化為對應(yīng)的基本包裝類型Number類型/*call有實(shí)參的情況*/function fn(){//傳遞的參數(shù)在函數(shù)內(nèi)部使用arguments獲取for(var i =0; i < arguments.length; i++){console.log(arguments[i]);}}//使用call方法來調(diào)用fn函數(shù)的時(shí)候,如果需要傳遞實(shí)參,將實(shí)參作為call方法的第二個(gè)參數(shù)開始依次傳遞fn.call(null,1,2,3,4)/*apply有實(shí)參的情況*/function fun(){for(var i=0;i<arguments.length;i++){console.log(arguments[i]);}}//使用apply方法來調(diào)用fun函數(shù)的時(shí)候,第二個(gè)參數(shù)是一個(gè)數(shù)組對象fun.apply(null,[1,3,5]);//第一個(gè)參數(shù):函數(shù)內(nèi)部this的值//[實(shí)參1,實(shí)參2,實(shí)參3]// call/aply的異同點(diǎn)//相同點(diǎn):他們都是Function.prototype對象中定義的方法//第一個(gè)參數(shù)都表示函數(shù)內(nèi)部的this的值//不同點(diǎn):在傳參的時(shí)候,如果給函數(shù)傳參的時(shí)候利用call方法,// apply傳遞的是數(shù)組.call傳遞的是用逗號(hào)分隔的一個(gè)一個(gè)的參數(shù)
/*上下文模式借用內(nèi)置方法*///數(shù)組里面的push方法實(shí)現(xiàn)的功能,向數(shù)組里面添加一個(gè)元素//1.借用push方法,向偽數(shù)組中添加元素;[].push Array.prototype//偽數(shù)組是沒有push方法的,首先我們要能訪問到push方法var arr={1:10,2:28};[].push.call(arr,10,20,30);console.log(arr);//jQuery對象也是偽數(shù)組//向數(shù)組中添加元素的方法//push//arr[arr.length]//2.借用數(shù)組的push方法向數(shù)組中添加元素var arr1 =[];var arr2=[10,120,10,20];//需求 將arr2中的元素添加到arr1中[].push.apply(arr1,arr2);//apply方法for(var i=0;i<arr2.length;i++){//之前的方法arr1.push(arr2[i]);}
//數(shù)組的方法經(jīng)常被偽數(shù)組所借用//1.需求 將一個(gè)偽數(shù)組轉(zhuǎn)化為真數(shù)組:slicevar arr=[13,12,12,34];arr.slice(1);//從索引1開始截取,到最后一個(gè)元素[12,12,34]var obj ={0:"范明",1:"小沈陽",length:2};[].slice.call(obj);//返回的是一個(gè)數(shù)組["范明","小沈陽"];[].slice.call(obj,1);//返回的是一個(gè)數(shù)組["小沈陽"];//2.刪除偽數(shù)組里面的元素var obj2 ={0:"范明",1:"小沈陽",2:"沈陽",length:2};//刪除數(shù)組中的第第三個(gè)元素,參數(shù)從第幾個(gè)開始刪,刪除幾個(gè)var newObj=[].splice.call(obj2,1,1);console.log(newObj);//["小沈陽"]console.log(obj2);//Object {0: "范明", 2: "沈陽", length: 1}[].splice.call(obj2,2,1,200,300);//從第三個(gè)參數(shù)開始是添加的元素
//3.借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承functionPerson(name,age){//父類構(gòu)造函數(shù)this.name=name;this.age=age;}// function Student(name,age,number){// this.age=age;// this.name=name;// this.number=number;// }//優(yōu)化functionStudent(age,name,number){//子類構(gòu)造函數(shù)Person.call(this,name,age);//給構(gòu)造函數(shù)的實(shí)例,添加name,age兩個(gè)屬性//this代表Student的實(shí)例//Student構(gòu)造函數(shù)借用Person構(gòu)造函數(shù)this.number=number;}var stu =newStudent(18,"zhangsan",12);console.log(stu);//注意條件:父類構(gòu)造函屬性要對子類對象通用
/*jQuery大結(jié)構(gòu)原理 init*/ ?function jQuery(){//init是一個(gè)構(gòu)造函數(shù),用于創(chuàng)建jQuery對象,并返回這個(gè)對象returnnew jQuery.prototype.init();}jQuery.prototype={constructor:jQuery,init:function(){returnthis;},css:function(){}};//init的原型指向jQuery的原型,這樣init創(chuàng)建的對象就可以使用jQuery原型中的方法了jQuery.prototype.init.prototype=jQuery.prototype;
轉(zhuǎn)載于:https://www.cnblogs.com/itlyh/p/6012095.html
總結(jié)
以上是生活随笔為你收集整理的函数的四种调用模式.上下文调用.call.apply的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AdminLTE的使用
- 下一篇: 炽寒天凤形态变化成烈火鸟还是烈焰凤凰还是