摘要:函數內部屬性函數內部有兩個特殊對象,其中是一個類數組對象,包含著傳入函數中的所有參數,主要用來保存函數參數。方法創建一個新的函數,調用時設置關鍵字為提供的值。
JavaScript函數內部屬性
函數內部有兩個特殊對象,this、arguments,其中arguments是一個類數組對象,包含著傳入函數中的所有參數,主要用來保存函數參數。arguments對象還有一個callee屬性,callee是一個指針,指向擁有這個arguments對象的函數。
calleefunction fact(num){ if(num<=1){ return 1; }else{ return num*fact(num-1); } }
這是一個實現階乘的函數,采用遞歸的方式,這種方式存在一個問題就是,當fact的名稱更改以后,如果不及時更改函數內部的函數名稱,該函數則無效。此時采用callee屬性替代當前擁有num參數對象的函數也就是fact.
采用callee實現如下
function fact(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } }this
this引用的是函數執行的環境對象,當函數被當做某個對象的方法調用時,此時的this對象引用的是當前調用函數的對象。
不同的環境this指向的值不同,下面是幾種this在不同執行環境下所指向的值
方法調用當函數作為對象方法的時候,函數里的this被綁定到當前對象上(也可以稱之為方法調用)
例如:
var myNum = { value:1, increment:function(arg){ this.value +=arg; } }; myNum.increment(3); console.log("example1:"+myNum.value);//example1:4
上述的increment是一個對象方法,該對象方法內部的this指向的就是當前對象
函數調用當函數作為非對象方法時候,this綁定到全局對象window,如果此時要調用內部函數可以采用that = this。
// 一般的函數 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();構造函數
用new運算符調用構造函數,會先創建一個連接到構造函數的prototype(原型對象),再將this綁定到該對象
function Person(name){
this.name = name; } Person.prototype.sayName = function(){ return this.name; } var person1 = new Person("TOM"); console.log(person1.sayName());applycallind
綁定this到指定的環境對象
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 :方法調用一個具有給定this值的函數,以及提供的參數列表。
apply: 方法調用一個具有給定this值的函數,以及提供的參數(數組或類數組對象)。
bind :方法創建一個新的函數,調用時設置this關鍵字為提供的“值”。
es6箭頭函數里的this指向定義時所在的對象,不是執行的環境對象,就說明this在箭頭函數里使用時是一個不變的值
function foo(){ setTimeout(()=>{ console.log("name:",this.name); },1000) } var name = "kiki"; foo.call({name:"didi"});//name:didi 箭頭函數里this的值指向的是定義時所在的環境對象,es5中實現箭頭函數的方法:采用 that = this這種機制,實現this的綁定 以上是對函數的內部屬性的理解。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102588.html
摘要:是班的學生構造函數的就是由這個構造函數得到的對象的原型對象父類對象構造函數的對象就是實例化對象和的原型對象。由于的所有對象都是構造函數只有除外。 前言 由于工作需求重新回顧了一下JavaScript,以下內容是我以前的學習筆記和其他參考資料整理完善后的內容,都是常用到的,使用頻率比較高的,自己必須得精通的知識點的總結,便以后再復習參考。 第一章 JavaScript原型對象與原型鏈 1...
摘要:是班的學生構造函數的就是由這個構造函數得到的對象的原型對象父類對象構造函數的對象就是實例化對象和的原型對象。由于的所有對象都是構造函數只有除外。 前言 由于工作需求重新回顧了一下JavaScript,以下內容是我以前的學習筆記和其他參考資料整理完善后的內容,都是常用到的,使用頻率比較高的,自己必須得精通的知識點的總結,便以后再復習參考。 第一章 JavaScript原型對象與原型鏈 1...
摘要:是班的學生構造函數的就是由這個構造函數得到的對象的原型對象父類對象構造函數的對象就是實例化對象和的原型對象。由于的所有對象都是構造函數只有除外。 前言 由于工作需求重新回顧了一下JavaScript,以下內容是我以前的學習筆記和其他參考資料整理完善后的內容,都是常用到的,使用頻率比較高的,自己必須得精通的知識點的總結,便以后再復習參考。 第一章 JavaScript原型對象與原型鏈 1...
摘要:詞法階段會定義函數所用到的變量,加入到內部屬性當中,它是一個數組,最后一位永遠都是全局對象,向前依次是祖先父級。這個等同于的非標準但許多瀏覽器實現的屬性。 內部屬性在我們了解對象原型及環境變量時都有遇到過,可是畢竟看不到摸不著,很難更加深入的了解它的工作流程和作用,最近在chrome當中查看對象結構時,看到了釋放出來的一些內部屬性,這些以前大概都是概念,那么既然能看到,就讓我們來探索一...
摘要:操作符或調用函數時傳入參數的操作都會導致關聯作用域的賦值操作。此外可以使用和來設置對象及其屬性的不可變性級別。忽視這一點會導致許多問題。使用調用函數時會把新對象的屬性關聯到其他對象。 前言 《你不知道的 javascript》是一個前端學習必讀的系列,讓不求甚解的JavaScript開發者迎難而上,深入語言內部,弄清楚JavaScript每一個零部件的用途。本書介紹了該系列的兩個主題:...
摘要:為了防止之后自己又開始模糊,所以自己來總結一下中關于作用域鏈和原型鏈的知識,并將二者相比較看待進一步加深理解。因此我們發現當多個作用域相互嵌套的時候,就形成了作用域鏈。原型鏈原型說完了作用域鏈,我們來講講原型鏈。 畢業也整整一年了,看著很多學弟都畢業了,忽然心中頗有感慨,時間一去不復還呀。記得從去年這個時候接觸到JavaScript,從一開始就很喜歡這門語言,當時迷迷糊糊看完了《J...
閱讀 630·2023-04-26 01:53
閱讀 2754·2021-11-17 17:00
閱讀 2891·2021-09-04 16:40
閱讀 1992·2021-09-02 15:41
閱讀 839·2019-08-26 11:34
閱讀 1228·2019-08-26 10:16
閱讀 1340·2019-08-23 17:51
閱讀 825·2019-08-23 16:50