了解JavaScript函數(shù)內(nèi)部屬性有哪些?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
函數(shù)內(nèi)部有兩個特殊對象,this、arguments,其中arguments是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù),主要用來保存函數(shù)參數(shù)。arguments對象還有一個callee屬性,callee是一個指針,指向擁有這個arguments對象的函數(shù)。
callee
function fact(num){ if(num<=1){ return 1; }else{ return num*fact(num-1); } }
這是一個實現(xiàn)階乘的函數(shù),采用遞歸的方式,這種方式存在一個問題就是,當fact的名稱更改以后,如果不及時更改函數(shù)內(nèi)部的函數(shù)名稱,該函數(shù)則無效。此時采用callee屬性替代當前擁有num參數(shù)對象的函數(shù)也就是fact.
采用callee實現(xiàn)如下
function fact(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } }
this
this引用的是函數(shù)執(zhí)行的環(huán)境對象,當函數(shù)被當做某個對象的方法調(diào)用時,此時的this對象引用的是當前調(diào)用函數(shù)的對象。
不同的環(huán)境this指向的值不同,下面是幾種this在不同執(zhí)行環(huán)境下所指向的值
方法調(diào)用
當函數(shù)作為對象方法的時候,函數(shù)里的this被綁定到當前對象上(也可以稱之為方法調(diào)用)
例如:
var myNum = { value:1, increment:function(arg){ this.value +=arg; } }; myNum.increment(3); console.log('example1:'+myNum.value);//example1:4
上述的increment是一個對象方法,該對象方法內(nèi)部的this指向的就是當前對象
函數(shù)調(diào)用
當函數(shù)作為非對象方法時候,this綁定到全局對象window,如果此時要調(diào)用內(nèi)部函數(shù)可以采用that = this。
// 一般的函數(shù) function add(a){ return a+2 ; } var value = 2; myNum.count = function (){ let value = 1; let help = function(){ this.value = add(this.value); } help(); console.log(this.value);//4 } myNum.count(); that = this方式 var value = 2; myNum.count = function (){ let value = 1; let that = this; let help = function(){ that.value = add(that.value); } help(); console.log(that.value);//3 } myNum.count();
構(gòu)造函數(shù)
用new運算符調(diào)用構(gòu)造函數(shù),會先創(chuàng)建一個連接到構(gòu)造函數(shù)的prototype(原型對象),再將this綁定到該對象
function Person(name){ this.name = name; } Person.prototype.sayName = function(){ return this.name; } var person1 = new Person('TOM'); console.log(person1.sayName());
apply\call\bind
綁定this到指定的環(huán)境對象
var people = { name:"LILY" } console.log(Person.prototype.sayName.apply(people)); console.log(Person.prototype.sayName.bind(people)()); console.log(Person.prototype.sayName.call(people));
call :方法調(diào)用一個具有給定this值的函數(shù),以及提供的參數(shù)列表。
apply: 方法調(diào)用一個具有給定this值的函數(shù),以及提供的參數(shù)(數(shù)組或類數(shù)組對象)。
bind :方法創(chuàng)建一個新的函數(shù),調(diào)用時設(shè)置this關(guān)鍵字為提供的“值”。
ES6 箭頭函數(shù)
es6箭頭函數(shù)里的this指向定義時所在的對象,不是執(zhí)行的環(huán)境對象,就說明this在箭頭函數(shù)里使用時是一個不變的值
function foo(){ setTimeout(()=>{ console.log('name:',this.name); },1000) } var name = "kiki"; foo.call({name:"didi"});//name:didi
箭頭函數(shù)里this的值指向的是定義時所在的環(huán)境對象,es5中實現(xiàn)箭頭函數(shù)的方法:采用 that = this這種機制,實現(xiàn)this的綁定
感謝各位的閱讀!看完上述內(nèi)容,你們對JavaScript函數(shù)內(nèi)部屬性有哪些大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道。
當前題目:JavaScript函數(shù)內(nèi)部屬性有哪些-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://jinyejixie.com/article20/cesoco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、搜索引擎優(yōu)化、網(wǎng)站收錄、ChatGPT、外貿(mào)建站、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容