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