js中this指向問題

在js中,this關鍵字的指向是一個比較重要的概念,它的值取決于函數的調用方式。

全局狀態下

//全局狀態下 this指向windowsconsole.log("this", this);console.log("this===windows", this === window);

在函數中

 // 在函數中 this指向windowsfunction text() {console.log("在函數中this", this);}text();

函數作為對象的方法被調用?

   // 函數作為對象的方法被調用 this指向該方法的對象const info = {name: "info",infoFunc: function () {console.log("info對象中this指向該對象", this, this.name);},};

?

構造函數中?

    // 構造函數中 this指向新創建的對象function Person(name) {this.name = name;console.log("構造函數", this);}const person = new Person("zs");

?

?函數嵌套函數,使用變量存儲this,箭頭函數

  const info2 = {name: "alice",// 函數嵌套函數 this 指向windowsinfo2Fun2: function () {function fun2() {console.log("函數嵌套函數中", this);}fun2();},info2Fun3: function () {//為了解決函數嵌套函數this指向windows的問題//將當前方法中的 this 值(也就是 info2 對象)存儲到 _this 變量中var _this = this;function fun3() {console.log("使用_this存儲this", _this);}fun3();},// 使用箭頭函數也可以解決函數嵌套函數 info2Fun4: function () {// 箭頭函數沒有this,向上尋找則為info2對象的thisconst fun2 = () => {console.log("info2Func2方法中的fun2函數", this);};fun2();},};info2.info2Fun2();info2.info2Fun3();info2.info2Fun4();

?

?

顯示修改this指向

在 JavaScript 中,apply、call?和 bind?是 Function 對象的三個重要方法,它們主要用于改變函數內部 this?的指向,同時還能在調用函數時傳遞參數

call

   function greet(message) {console.log(`${message}, ${this.name}`);}const person2 = { name: "John" };greet(person2, "Hello1111");greet.call(person2, "Hello");

不加call為什么是[object Object],?

普通函數調用的時候 this指向全局對象,在這個調用里面,把person2作為參數傳遞給greet函數,但函數內部不指向perosn2。greet函數只接收一個參數,當調用的時候,message被賦值為perosn2,第二個參數就被忽略了。全局對象的name為空字符串,同時message是person2對象,對象默認的字符串表示形式是?[object Object]? 所以打印結果為[object Object]

  console.log('window.name',window.name,typeof(window.name));

?

加call

call方法第一個參數就是要綁定給this的對象,后續參數依次傳遞給被調用的函數,當調用的時候,this被顯示地綁定到person2對象上,message被賦值為Hello

call方法支持傳入多個參數,以逗號隔開

     function greet(message,message2) {console.log(`${message}, ${this.name},${message2}`);}const person2 = { name: "John" };greet.call(person2, "Hello","aaaaa");

?

apply?

apply與call類似,第一個參數都是指定函數執行時this的值,第二個參數也是傳遞數據用的,區別是它是以數組元素的形式傳入的,多個參數則傳入多個元素。當不確定參數數量的時候使用apply更方便。

   greet.apply(person2,['BBBBBBBB','CCCCC'])

?

bind

bind與call和aplly類似,第一個參數也是指定函數執行時this的值,區別是call和apply會立即執行,而bind會返回一個新的函數供后續使用

   const greet2=greet.bind(person2,'DDDDDD','EEEEE');greet2();

?

   const greet3=greet.bind(person2,'FFFFF','GGGGGG');greet3();

?

vue中的this

選項式API

在生命周期,methods,computed,watch中,this都指向組件實例

<template><div class="box"><div @click="addNum">A:{{ num }}</div><div @click="addNum2">B:{{ num }}</div><div @click="addNum2">C:{{ num2}}</div></div>
</template><script>
export default {data(){return {num:10}},computed:{num2(){console.log('computed',this);return this.num;}},watch:{num(newvalue,oldvalue){console.log('watch',this);      console.log(newvalue,oldvalue);}},created(){console.log('created中this',this);},mounted(){console.log('mounted中this',this);},methods:{addNum(){console.log('methods',this);this.num++;},addNum2:()=>{console.log('箭頭函數',this);}}}
</script>

組合式API

組合式 API 鼓勵將邏輯封裝在函數中,這些函數可以在setup函數中調用。通過這種方式,邏輯更加模塊化,作用域更加清晰。不再依賴this來訪問實例的屬性和方法,而是直接從返回的對象中解構出所需的變量和函數。

END?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的NISP二級之路-03

目錄 一.ISMS 二.IP 三.http 四.防火墻 五.文件 解析 解析 六.攻擊 解析 解析 七.風險管理工程 八.信息系統安全保護等級 九.我國信息安全保障 一.ISMS 1.文檔體系建設是信息安全管理體系(ISMS)建設的直接體現&#xff0c;下列說法不正確的是&#xff1a; A&#…

HarmonyOS應用開發者高級-編程題-001

題目一&#xff1a;跨設備分布式數據同步 需求描述 開發一個分布式待辦事項應用&#xff0c;要求&#xff1a; 手機與平板登錄同一華為賬號時&#xff0c;自動同步任務列表任一設備修改任務狀態&#xff08;完成/刪除&#xff09;&#xff0c;另一設備實時更新任務數據在設備…

動態列表的數據渲染、新增、編輯等功能開發及數據處理

說一個比較繁瑣的功能吧&#xff0c;我使用的是 vue element UI vxe-table 來實現的這個動態列表&#xff0c;其實呢 vxe-table 這個表格插件里邊有動態表格 vxe-grid 只需要通過表頭數組里邊的 field: name, 與表體數組里的 name: Test1, 對應上就行了&#xff0c;很簡單吧…

Linux學習筆記——文件系統基礎與根文件系統詳解

文件系統基礎與根文件系統詳解 什么是文件系統&#xff1f;什么是根文件系統&#xff08;Root File System&#xff09;&#xff1f;一句話理解&#xff1a;更詳細地說&#xff1a; 根文件系統為什么重要&#xff1f;1. 啟動依賴2. 提供根目錄 /3. 支持掛載其他文件系統4. 提供…

R語言進行聚類分析

目錄 簡述6種系統聚類法 實驗實例和數據資料&#xff1a; 上機實驗步驟&#xff1a; 進行最短距離聚類&#xff1a; 進行最長距離聚類&#xff1a; 進行中間距離聚類&#xff1a; 進行類平均法聚類&#xff1a; 進行重心法聚類&#xff1a; 進行ward.D聚類&#xff1a;…

【回眸】Linux 內核 (十四)進程間通訊 之 信號量

前言 信號量概念 信號量常用API 1.創建/獲取一個信號量 2.改變信號量的值 3. 控制信號量 信號量函數調用 運行結果展示 前言 上一篇文章介紹的共享內存有局限性,如:同步與互斥問題、內存管理復雜性問題、數據結構限制問題、可移植性差問題、調試困難問題。本篇博文介…

記錄IBM服務器檢測到備份GPT損壞警告排查解決過程

服務器設備&#xff1a;IBM x3550 M4 Server IMM默認IP地址&#xff1a;192.168.70.125 用戶名&#xff1a;USERID 密碼&#xff1a;PASSW0RD&#xff08;注意是零0&#xff09; 操作系統&#xff1a;Windows Hyper-V Server 2016 IMM Web System Status Warning&#xff1…

“Pseudo Global Warming”:偽全球變暖PGW

“Pseudo Global Warming”&#xff1a;偽全球變暖PGW PGW方法概述&#x1f50d; 一、PGW 方法的定義&#x1f9e0; 二、PGW 方法的基本原理&#x1f6e0;? 三、PGW 方法的主要步驟&#x1f4c8; 四、PGW 模擬時常涉及的變量&#x1f4ca; 五、PGW 方法的優/缺點&#x1f4da;…

2025-04-06 Unity Editor 2 —— GUILayout

文章目錄 常用組件1 Label 文本標簽2 TextField / TextArea / PasswordField 輸入框3 Butto / RepeatButton 按鈕4 Horizontal / Vertical 方向布局5 Box 自動布局框6 ScrollView 滾動視圖7 Horizontal / VerticalSlider 滑動條8 Area GUI 區域9 Window 窗口10 Toolbar 工具欄1…

Qt 交叉編譯詳細配置指南

一、Qt 交叉編譯詳細配置 1. 準備工作 1.1 安裝交叉編譯工具鏈 # 例如安裝ARM工具鏈(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf# 或者64位ARM sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 1.2 準備目標…

用PointNet++訓練自己的數據集(語義分割模型semseg)

&#xff08;1&#xff09;訓練部件分割&#xff08;partseg&#xff09;模型和檢測自己點云并將結果保存txt&#xff0c;請看博主上兩篇文章 &#xff08;2&#xff09;本文背景是將pipe點云上的缺陷和本體檢測出來&#xff0c;即1種語義場景&#xff08;pipe&#xff09;&…

kotlin中主構造函數是什么

一 Kotlin 中的主構造函數 主構造函數&#xff08;Primary Constructor&#xff09;是 Kotlin 類聲明的一部分&#xff0c;用于在 創建對象時初始化類的屬性。它不像 Java 那樣是一個函數體&#xff0c;而是緊跟在類名后面。 主構造函數的基本定義 class Person(val name: S…

PHP 過濾器

PHP 過濾器 引言 PHP作為一種廣泛使用的服務器端腳本語言&#xff0c;提供了強大的數據處理能力。在處理數據時&#xff0c;確保數據的安全性和準確性至關重要。PHP過濾器&#xff08;Filters&#xff09;就是用來對數據進行預處理和后處理的工具。本文將詳細介紹PHP過濾器的…

【WebRTC】開源項目Webrtc-streamer介紹

WebRTC-Streamer 這是一個用于通過簡單的信令機制&#xff08;參見 api&#xff09;流式傳輸 WebRTC 媒體源的實驗項目&#xff0c;支持以下媒體源&#xff1a; 捕獲設備 屏幕捕獲 mkv 文件 RMTP/RTSP 源 同時該項目也兼容 WHEP 接口。 注意 * 在線演示已停止&#xff0c…

【Java設計模式】第9章 原型模式講解

9. 原型模式 9.1 原型模式講解 定義:通過拷貝原型實例創建新對象,無需調用構造函數。特點: 創建型模式無需了解創建細節適用場景: 類初始化消耗資源多對象創建過程繁瑣(如屬性賦值復雜)循環體中需創建大量對象優點: 性能優于直接new簡化創建流程缺點: 必須實現clone()…

【Java集合】LinkedList源碼深度分析

參考筆記&#xff1a;java LinkedList 源碼分析&#xff08;通俗易懂)_linkedlist源碼分析-CSDN博客 目錄 1.前言 2.LinkedList簡介 3.LinkedList的底層實現 4.LinkedList 與 ArrayList 的對比 4.1 如何選擇 4.2 對比圖 5.LinkedList 源碼Debug 5.1 add(E e) &#xff…

openssl源碼分析之加密模式(modes)

openssl實現分組加密模式&#xff08;例如AES128-CBC的CBC部分&#xff09;的模塊名字叫做modes&#xff0c;源代碼位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不開github了TT&#xff0c;只能找個gitee鏡像 頭文件是modes.h。 該模塊目前…

Java 搭建 MC 1.18.2 Forge 開發環境

推薦使用 IDEA 插件 Minecraft Development 進行創建項目 創建完成后即可進行 MOD 開發。 但是關于 1.18.2 的開發教程太少&#xff0c;因此自己研究了一套寫法&#xff0c;寫法并非是最優的但是是探索開發MOD中的一次筆記和記錄 GITHUB: https://github.com/zimoyin/zhenfa…

nginx如何實現負載均衡?

Nginx 是一款高性能的 Web 服務器和反向代理服務器&#xff0c;它可以通過配置實現負載均衡功能。以下是實現負載均衡的詳細步驟和方法&#xff1a; 1. 基本概念 負載均衡是將客戶端請求分發到多個后端服務器上&#xff0c;以提高系統的可用性和性能。Nginx 支持多種負載均衡策…

深度學習天崩開局

李沐大神的d2l包導入&#xff0c; 這玩意需要python311版本&#xff0c;我現在版本已經313了&#xff0c;作為一個天生要強的男人&#xff0c;我是堅決不向低版本低頭的。 然后我就研究啊&#xff0c;各種翻資料啊&#xff0c;然后deepseek加豆包都翻爛了&#xff0c; 最終所…