国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JavaScript中的this指向,call、apply、bind的簡單實現

開發 前端
this是JavaScript中一個特殊關鍵字,用于指代當前執行上下文中的對象。它的難以理解之處就是值不是固定的,是再函數被調用時根據調用場景動態確定的,主要根據函數的調用方式來決定this指向的對象。

JavaScript中的this

this是JavaScript中一個特殊關鍵字,用于指代當前執行上下文中的對象。它的難以理解之處就是值不是固定的,是再函數被調用時根據調用場景動態確定的,主要根據函數的調用方式來決定this指向的對象。this 的值在函數被調用時動態確定,以下是幾種常見的情況:

  • 全局上下文中:當在全局作用域中調用函數時,this 指向全局對象。在瀏覽器環境中,這個全局對象是 window 對象。
console.log(this); // 在瀏覽器中,輸出為 Window 對象
  • 函數作為對象的方法:當函數作為對象的方法被調用時,this 指向調用該方法的對象。
const obj = {
  property: 'value',
  printProperty: function() {
    console.log(this.property);
  }
};


obj.printProperty(); // 輸出 'value'
  • 構造函數中:在使用 new 關鍵字創建實例時,構造函數內部的 this 指向即將創建的新實例。
function Person(name) {
  this.name = name;
}


const person = new Person('Alice');
console.log(person.name); // 輸出 'Alice'
  • 顯式綁定:使用call、apply、bind方法可以顯式指定this的綁定對象。
function greet(message) {
  console.log(`${message}, ${this.name}!`);
}


const person = { name: 'Bob' };


greet.call(person, 'Hello'); // 輸出 'Hello, Bob!'
  • 箭頭函數:箭頭函數不綁定this,它會捕獲外層作用域的this值作為自己的this。
const obj = {
  method: function() {
    const arrowFunc = () => {
      console.log(this === obj);
    };
    arrowFunc();
  }
};


obj.method(); // 輸出 true
  • class中的this:類中的this默認指向類的實例對象。
class Rectangle {
  constructor(width, height) {
    this.width = width;
    this.height = height;
  }
}


const rect = new Rectangle(10, 20);
console.log(rect.width); // 輸出 10
  • 事件綁定事件綁定中的this是指向觸發事件的dom元素。
const button = document.getElementById('myButton');


button.addEventListener('click', function() {
  console.log(this === button);
});
// 在按鈕點擊時輸出 true

如何改變this指向

改變 this 指向是在 JavaScript 中常見的需求,特別是當你想要在不同的上下文中調用函數時。以下是幾種常見的方法來改變 this 指向:

  • 使用 call 方法:call 方法允許你顯式地指定函數內部的 this 值,并且傳遞參數列表。第一個參數是要綁定的 this 值,后面的參數是函數的參數。
function greet(message) {
  console.log(`${message}, ${this.name}!`);
}


const person = { name: 'Alice' };


greet.call(person, 'Hello'); // 輸出 'Hello, Alice!' 這里把this綁定給person對象
  • 使用 apply 方法:apply 方法與 call 類似,但它接受一個數組或類數組對象作為參數,其中的元素將作為函數參數傳遞。
function greet(message) {
  console.log(`${message}, ${this.name}!`);
}


const person = { name: 'Bob' };


greet.apply(person, ['Hi']); // 輸出 'Hi, Bob!'
  • 使用 bind 方法:bind 方法創建一個新函數,將 this 值永久地綁定,并可以預先設置部分參數。原函數不會受到影響。
function greet(message) {
  console.log(`${message}, ${this.name}!`);
}


const person = { name: 'Charlie' };
const greetPerson = greet.bind(person);


greetPerson('Hey'); // 輸出 'Hey, Charlie!'
  • 使用箭頭函數:箭頭函數不會綁定獨立的 this 值,而是捕獲其外部函數的 this 值。
const obj = {
  method: function() {
    const arrowFunc = () => {
      console.log(this === obj);
    };
    arrowFunc();
  }
};


obj.method(); // 輸出 true

call和apply區別

  1. bind 方法:
  • bind 方法創建一個新函數,將原函數的 this 值永久綁定到指定的對象,并可以在調用時傳遞參數。
  • 它不會立即執行原函數,而是返回一個新的函數,需要手動調用新函數以執行原函數。
  • bind 方法不會改變原函數的上下文,而是返回一個新函數。
  1. call 方法:
  • call 方法立即調用函數,并指定函數內部的 this 值,同時可以傳遞參數列表。

  • 它的第一個參數是要綁定的 this 值,后續的參數會作為函數的參數傳遞。

  1. apply 方法:

  • apply 方法也立即調用函數,并指定函數內部的 this 值,但參數傳遞方式不同。

  • 它的第一個參數是要綁定的 this 值,第二個參數是一個數組(或類數組對象),其中的元素會作為函數的參數傳遞。

實現call、apply、bind

這里實現簡化版的,核心思路是:

  1. 將函數設為傳入對象的一個屬性
  2. 執行該函數
  3. 刪除該函數(臨時函數調用完成刪除,防止內存泄漏,以免context 對象造成污染)
  4. 返回結果或傳入的this

call

js
Function.prototype.myCall = function(context, ...args) {
  context = context || window;
  const fn = Symbol();


  context[fn] = this;


  const result = context[fn](...args);
  delete context[fn];


  return result;
}

apply

js
Function.prototype.myApply = function(context, args) {
  context = context || window;
  const fn = Symbol();


  context[fn] = this;


  let result;
  if(args) {
    result = context[fn](...args);
  } else {
    result = context[fn]();
  }


  delete context[fn];
  return result;
}

bind

js
Function.prototype.myBind = function(context, ...outerArgs) {
  context = context || window;
  const _this = this;
  
  return function(...innerArgs) {
    context[fn] = _this;
    const result = context[fn](...outerArgs, ...innerArgs);
    delete context[fn];
    return result;
  }
}

責任編輯:武曉燕 來源: 海燕技術棧
相關推薦

2024-03-15 08:21:17

bindJavaScrip函數

2021-12-05 08:27:56

Javascript 高階函數前端

2021-06-18 07:16:17

JavaScript apply()方法call()方法

2024-08-26 08:36:26

2024-08-20 16:04:27

JavaScript開發

2015-03-02 09:22:09

Javascript函數用法apply

2017-10-10 14:36:07

前端Javascriptapply、call、

2011-03-22 09:49:15

JavaScript

2021-11-30 06:56:58

CallApply函數

2021-06-09 07:01:30

前端CallApply

2017-07-27 16:31:11

2023-06-28 08:34:02

Bind()函數JavaScript

2019-04-03 10:50:09

Javascript區塊鏈技術

2015-10-29 14:29:48

javascriptthis指向

2025-03-03 08:40:00

JavaScriptthis開發

2011-08-15 12:55:54

SQL ServerOUTER APPLYCROSS APPLY

2015-06-08 13:19:11

JavaScriptgettersetter

2018-09-18 10:11:21

前端vue.jsjavascript

2017-08-22 16:40:22

前端JavaScript接口

2021-12-01 06:40:32

Bind原理實現
點贊
收藏

51CTO技術棧公眾號

成人三级伦理片| 一区二区蜜桃| 欧美揉bbbbb揉bbbbb| 黄页在线免费看| 国产成人午夜电影网| 日韩av高清| 成人在线免费观看网站| 97在线视频免费| 成人噜噜噜噜| 日韩在线视频线视频免费网站| gogo久久| 亚洲美女av在线播放| gogo久久| 亚洲精品福利免费在线观看| wwwav在线| 91精品国产高清一区二区三区蜜臀 | 亚洲黄色网址在线观看| 美女国产精品| 日韩免费电影一区二区三区| 亚洲尤物在线| 日韩欧美电影一区二区| 蜜臀av性久久久久蜜臀aⅴ| 日本一区二区三区免费看| 久久只有精品| 国产av不卡一区二区| 丰满亚洲少妇av| 国产成人a亚洲精v品无码| 久久久久久久性| 电影天堂最新网址| 婷婷国产在线综合| 青青影院在线观看| 欧美一区二区三区视频免费播放| 里番在线播放| 一本色道久久88综合亚洲精品ⅰ | 天天成人综合网| 国产成人av影院| 男女爽爽爽视频| 亚洲精品国久久99热| 神马久久精品| 欧美电影一区二区三区| 91福利在线免费| 一本一道久久a久久精品逆3p| vam成人资源在线观看| 欧美激情综合亚洲一二区| 国产在线观看91一区二区三区| 成人黄色大片在线免费观看| 麻豆久久精品| 无码精品国产一区二区三区免费| 亚洲激情自拍视频| 成人免费看片| 欧美猛交免费看| 国产韩国精品一区二区三区| 日韩精品久久一区| 久久色.com| 黄色在线观看网| 亚洲女人初尝黑人巨大| 日韩精选在线| 久久免费99精品久久久久久| av在线这里只有精品| 中文字幕在线永久在线视频| 一区二区电影免费观看| 久久综合一区二区| 狠狠久久综合婷婷不卡| 日韩久久99| 中文字幕亚洲区| 国产经典一区二区| 动漫一区二区三区| www.久久久久久.com| 日韩porn| 免费美女久久99| 亚洲国产精品资源| 国产熟人av一二三区| 日韩欧美精品综合| 最近的2019中文字幕免费一页| 1204国产成人精品视频| 国产精品日韩一区二区| av一二三不卡影片| 欧美婷婷久久五月精品三区| 中文字幕在线日韩| 欧美激情日韩| 亚洲欧美日韩一级| 亚洲精品白浆高清久久久久久| 第九色区aⅴ天堂久久香| 91看片淫黄大片91| 色综合咪咪久久| 国产ts一区| 九九久久九九久久| 欧美性xxxx极品高清hd直播| 国产在线不卡一区二区三区| 欧美一区二视频在线免费观看| 亚洲色图19p| 欧美国产大片| 免费不卡亚洲欧美| 亚洲丶国产丶欧美一区二区三区| 精品美女一区| 亚洲在线视频一区二区| 欧洲精品一区二区三区在线观看| 亚洲精华一区二区三区| 91专区在线观看| 亚洲精品在线免费播放| 国内精品亚洲| 色播视频在线观看| 亚洲91av视频| 91啪亚洲精品| 中文一区一区三区高中清不卡免费| 高清免费日韩| 亚洲特黄一级片| **精品中文字幕一区二区三区| 日日骚一区二区网站| 欧美色国产精品| 亚洲澳门在线| 美女网站在线| 国产精品成人观看视频国产奇米| 99九九99九九九视频精品| 污污的网站在线免费观看| 国产综合 伊人色| 在线观看日韩精品| 五月激情综合| 亚洲一区在线日韩在线深爱| 国产成人综合av| 亚洲美女淫视频| 欧美日韩导航| 可以免费看污视频的网站| 欧美另类极品videosbestfree| 成人一道本在线| 亚洲精品555| 男人添女荫道口喷水视频| 伊人影院在线视频| 亚洲tv在线观看| 五月天激情小说综合| 日韩欧美电影| 天堂成人在线| 亚洲一区亚洲二区亚洲三区| 欧美网站在线观看| 国内在线观看一区二区三区| www.亚洲.com| 欧美日韩在线一区二区三区| 欧美一级片免费看| 毛片基地黄久久久久久天堂| 女同视频在线观看| 一区二区视频在线观看| 在线看福利67194| 久久夜色精品国产欧美乱极品| 久久在线观看| 91原色影院| 亚洲a∨日韩av高清在线观看| 欧美日韩一卡二卡三卡| 日本女优在线视频一区二区| 美女一区网站| 国产综合免费视频| 日本高清视频一区| 色婷婷国产精品综合在线观看| 国产乱码精品| 欧美日韩成人影院| 中文字幕桃花岛| 国产精品7m视频| 欧美亚洲国产一区二区三区va| 免费精品99久久国产综合精品| 香蕉久久一区| 2023欧美最顶级a∨艳星| 国产一区自拍视频| 亚洲视频精品在线| 中文字幕av一区 二区| 综合视频在线| 三妻四妾完整版在线观看电视剧 | 精品制服美女丁香| 免费在线黄色av| 在线成人中文字幕| 久久这里只有| 日韩免费小视频| gay视频丨vk| 国产一区二区三区无遮挡| 欧美一区二区在线观看| 国内成人自拍视频| ccyy激情综合| 欧美xxx.com| 日韩国产精品毛片| 久久久久久12| 欧洲在线/亚洲| 成人免费视频一区| 成人嘿咻视频免费看| 国产盗摄在线视频网站| 国产wwwxx| 99久久99久久| 国产亚洲欧美一区在线观看| 国产高清亚洲一区| 欧洲激情综合| 精品久久久久久综合日本欧美| 99久久精品网| 成人免费av电影| 翡翠波斯猫1977年美国| 三级理论午夜在线观看| 日韩片电影在线免费观看| 欧美成人免费小视频| 欧美亚一区二区| 99精品久久久久久| 在线日韩欧美| 99国产精品久久一区二区三区| 亚洲精品传媒| 999大胆视频|