js中對函數的深入理解(下)

2020-12-13 百家號

在js函數中,有一個特殊的對象this,this引用的就是函數執行的環境對象,當在全局作用域中的時候,this指向的對象就是window;

這裡getName函數的作用域是window,當我們直接調用該函數的時候,this指向的是window對象,所以this.name就成了window.name;而這裡我們將getName函數賦給對象obj時,this引用的是obj對象,此時this.name會轉換成obj.name;所以列印出來是「Jack」。

函數對象也有自己的屬性,如caller屬性,該屬性保存著調用當前函數的函數的引用,如果是在全局作用域中調用的函數,那它的值為null;

當我們調用test()函數的時候,test函數中調用了add函數,此時add函數中的add.caller就指向了test函數,所以這裡會把test函數的源碼列印出來。這裡為了代碼更便於維護,我們還可以使用之前我們學的arguments.callee.caller代替add.caller,效果是一樣的。

不過,在嚴格模式(strict mode)下,arguments.callee會導致錯誤;arguments還有另一個屬性caller,不過在嚴格模式下也會報錯,非嚴格模式下返回undefind。一般這兩個屬性很少使用。

大家都知道,函數是對象,所以每個函數都有自己的屬性和方法,例如length和prototype屬性,length屬性表示函數接收的命名參數的個數;

其中,最讓人難以理解的要數prototype屬性了,它保存了所有對象的實例方法和屬性。當我們創建引用類型以及實現繼承的時候,prototype屬性是最為關鍵的,該屬性不可枚舉,不能使用for in循環遍歷;由於prototype會牽扯到js中對象高級的應用,所以我們這裡就不再討論,以後會出相關的教程。

除了這兩個屬性為,函數還有兩個常用的方法:apply()和call();它們實質上用法是一樣的,只是各自傳遞的參數不同,都是在特定的作用域中調用函數然後改變this的指向;apply()方法接收兩個參數,一個是在其中運行函數的作用域,另一個是數組,而call()和apply()唯一不同的就是第二參數,它不是一個數組,而是把多個值逐一列出來:

call()的用法:

這裡我們注意到,它們的返回值其實都是一樣的,至於在工作中使用哪一個,根據代碼自身情況來定吧。

以上就是我對js中函數的部分總結,如果這篇文章對你有幫助,歡迎轉載,評論區留言。

相關焦點

  • 徹底理解js中this的指向
    ,只有函數執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個調用它的對象(這句話有些問題,後面會解釋為什麼會有問題,雖然網上大部分的文章都是這樣說的,雖然在很多情況下那樣去理解不會出什麼問題,但是實際上那樣理解是不準確的,所以在你理解this的時候會有種琢磨不透的感覺),那麼接下來我會深入的探討這個問題。
  • 徹底理解js中的this指向
    我覺得this概念抽象,變化多端總是讓人暈頭轉向,但平心它並不是有多難,今天我們就從this綁定的五種場景(默認綁定、隱式綁定、顯式綁定、new綁定、箭頭函數綁定)出發,靜下心來好好聊聊這個 this,本文開始。
  • 怎麼在click事件中調用多個js函數
    源 / php中文網      源 / www.php.cnjs中的click事件想要實現調用多個函數的功能,我們可以使用addEventListener()方法。也就是說如果要在按鈕的單擊事件中調用或執行多個函數,就可以使用JavaScript addEventListener()方法。下面我們就結合具體的代碼示例,給大家介紹js中的click事件調用多個函數的實現方法。代碼示例如下:<!
  • JS 中的 with 關鍵字
    注意:在嚴格模式下不能使用with語句。with關鍵字的弊端前面的基本說明中,我們可以看到with的作用之一是簡化代碼。但是為什麼不推薦使用呢?,在foo函數內,使用了with關鍵字來訪問傳進來的obj對象,然後修改a屬性。
  • 三年經驗的前端,如何理解JS三座大山
    在 js 中,所有對象都是 Object 的實例,並繼承 Object.prototype 的屬性和方法,但是有一些是隱性的。我們來看一下原型的規則:所有的引用類型(包括數組,對象,函數)都具有對象特性;可自由擴展屬性。
  • JavaScript中的函數是什麼,如何去理解它
    在我們的JavaScript中的函數是可以完成特定功能的一系列代碼的合集,在函數被調用前函數數體內的代碼並不執行,是獨立於主程序的。可以把程序中大部分功能拆解成一個個函數,是主程序的代碼清晰,易於理解和維護。
  • d3.js漫遊指南
    d3的API文檔上長長的函數列表也許嚇壞了你,d3主頁上列出的幾十篇教程也許讓你難以選擇。有超過兩萬個d3示例可供學習,但你永遠不知道給定的示例是否容易理解。如果你更喜歡看書,那麼Scott Murray的Interactive Data Visualization for the Web是一個很好的起點,而Elijah Meeks的D3.js in Action比較全面地深入了部分API.我希望這篇指南能幫助你在心智上做好理解d3的準備,並指出一些值得探索的方向。
  • 深入理解箭頭函數,學習其非常特殊且有用的特性
    深入理解箭頭函數讓我們深入研究一下箭頭函數。箭頭函數不僅僅是編寫簡潔代碼的「捷徑」。它還具有非常特殊且有用的特性。JavaScript 充滿了我們需要編寫在其他地方執行的小函數的情況。JavaScript 的精髓在於創建一個函數並將其傳遞到某個地方。在這樣的函數中,我們通常不想離開當前上下文。這就是箭頭函數的主戰場啦。
  • 【專業技術】關於JS的prototype
    概述:在接觸JS的過程中,隨著理解的深入會逐漸的理解一些比較深奧的理論或者知識
  • js代碼優化之編程函數
    在編程的世界中,有這樣的一個原則,簡稱二八定律二八定律:影響程序的80%性能的往往是20%的代碼在js的編寫過程中,函數設計就相當於那20%,時刻影響著你的代碼,可以說是至關重要。那麼對於函數的設計原則,你又了解多少?1.
  • 前端開發為什麼要學Node.js?小白如何深入理解Node.js?
    隨著網際網路的高速發展以及市場需求推動,Node已經成為前端知識棧必備技能之一,千鋒廣州Web大前端老師也發現很多企業在招聘中也會著重考察求職者對Node的掌握程度。有人好奇從事Web前端為什麼要學習Node.js?今天千鋒廣州Web前端培訓老師就給大家詳細的分析一下。
  • 高階函數不會用?教你JS中最實用的幾個高階函數用法
    這種預置函數也是js中巧妙的裝飾者模式的實現,裝飾者模式在實際開發中也非常有用,再以後的歲月裡我也會好好研究之後分享給大家的。在一個函數中填充幾個參數,然後再返回一個新函數,最後進行求值,沒了,是不是說的簡單了。
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫v-開頭2.參數1,指令的名稱,定義的時候,指令的前面不需要加V-前綴,用的時候才加3.參數2,是一個對象,這個對象身上有一些指令相關的函數,這些函數在特定的階段執行相關的操作Vue.directive('focus',{bind:function(el){函數中第一個參數永遠是el,表示被綁定了指令的那個元素
  • Node.JS快速入門
    ,代碼內容我們在命令提示符下輸入命令node demo1.js ,結果如下:2.2 使用函數我們剛才的例子非常簡單,咱們這裡再看一下函數的使用:我們在命令提示符下輸入命令node demo2.js ,結果如下:
  • 面試官:聊聊對Vue.js框架的理解
    分享目標:了解 Vue.js 中的 Virtual DOM 及 Diff 原理分享keynote:Vue.js框架原理剖析.key原文地址Vue.js概述Vue 是一套用於構建用戶界面的漸進式那怎麼理解漸進式呢?漸進式含義:強制主張最少。漸進式概念Vue.js包含了聲明式渲染、組件化系統、客戶端路由、大規模狀態管理、構建工具、數據持久化、跨平臺支持等,但在實際開發中,並沒有強制要求開發者之後某一特定功能,而是根據需求逐漸擴展。
  • 在 Node.js 7 中甩掉 Callback Hell
    在幾個月之前,V8 引擎就實現了對 async/await 關鍵字的支持,Node.js 7中的 V8 經過幾次更新,終於在上一個 night build 版本中加入對為了解決 callback hell(回調地獄),程式設計師們一直在努力,從最早的回調函數,到 Promise 對象,再到 Generator 函數,每次都有所改進,但又讓人覺得不徹底 —— 因為使用它們之前都需要理解抽象的底層運行機制。
  • 是否還在疑惑Vue.js中組件的data為什麼是函數類型而不是對象類型
    要理解本篇文章,必須具備JavaScript中基本數據類型和引用數據類型的概念,大家可以花兩分鐘看一下,瞬間就能理解——面試題被問到再也不慌,深究JavaScript中的深拷貝與淺拷貝,看完這篇文章以後,再來看這篇文章就會很容易理解了。
  • 從TensorFlow.js入手了解機器學習
    我學習機器學習沒有多久,在這個領域是個新手,在本文裡我將嘗試用自己的理解去解釋一些概念。不過,在使用已有的 AI 模型的時候我們並不需要很深的機器學習知識。我們可以使用現有的一些工具比如 Keras、TensorFlow 或 TensorFlow.js。這裡我們將看看如何創建 AI 模型並且使用 TensorFlow.js 中的一些複雜的模型。
  • 深入理解深度學習中的激活函數
    導讀數字邏輯電路中的門電路可以讓滿足不同條件的輸入信號輸出開(1)或關(0)輸出。這體現在機器學習中感知機的性質。但我們也知道感知機有個局限性,即無法單層表示非線性變化,而神經網絡往往通過激活函數用來表示非線性變化。即激活函數的作用就是引入非線性。
  • 乾貨 | 快速讀懂 JS 原型鏈
    理解原型鏈Js 中的原型鏈是一個比較有意思的話題,它採用了一套巧妙的方法,解決了 Js 中的繼承問題。原型(prototype)原型(prototype)是一個普通的對象,它為構造函數的實例共享了屬性和方法。在所有的實例中,引用到的原型都是同一個對象。