網站首頁 編程語言 正文
介紹
- 相同點:
都是function
上的方法,都可以改變this的指向
。 - 不同點:
-
call 主要接收多個
散列的參數
,調用后立即執行函數,得到結果function.call(obj, params1, params2, params3,…);
obj: 需要改變this指向的對象
params1, params2, params3:需要傳遞的參數 -
apply 接收一個
數組
形式的參數fun.apply(obj, [params1, params2, params3,…]);
-
bind 跟 call 傳遞參數形式是一樣的,只是bind不會立即執行函數,而是返回一個新的函數再調用執行
function.call(obj, params1, params2, params3,…);
obj: 需要改變this指向的對象
params1, params2, params3:需要傳遞的參數
var r = function.bind(obj, params1, params2, params3, …);
r();
-
call()
function aa () {
console.log(this)
console.log(1)
}
aa.call();
/*
執行結果:
VM2559:2 Window {0: global, 1: global, 2: global, 3: Window, 4: global, window: Window, self: Window, document: document, name: '', location: Location, …}
VM2559:3 1
*/
從上面的示例可以看出call()可以作為函數的調用,并且this是指向window對象
但是想要改變this的指向問題,怎么操作呢?請看下面的示例。
function aa () {
// 此處想要輸出貓cat的年齡age的值,但此時this是指向window對象的,所以找不到age,所以打印輸出了undefined
console.log(this.age) // undefined
console.log(1) // 1
}
var cat = {
age: 2
}
aa.call()
/*
執行結果:
VM2908:2 undefined
VM2908:3 1
*/
如果要將this指向cat這個對象怎么操作,其實也是很簡單的,如下:
function aa () {
console.log(this,this.age)
console.log(1)
}
var cat = {
age: 2
}
aa.call(cat)
/*
執行結果:
VM3537:2 {age: 2} 2
VM3537:3 1
*/
但是想要傳遞一些參數,怎么處理呢?請繼續往下看
function aa (data,data1) {
console.log(this)
console.log(`${this.name}年齡${this.age}歲,愛吃${data}和${data1}`)
console.log(1)
}
var cat = {
name: '小希',
age: 2,
}
// 重點,call 方法可以接收多個參數
aa.call(cat, '魚', '肉')
/*
VM4488:2 {name: '小希', age: 2}
VM4488:3 小希年齡2歲,愛吃魚和肉
VM4488:4 1
*/
apply
apply 與 call 的使用主要體現在參數上的差別,call是依次傳遞各個參數,apply是傳遞一個數組,調用后函數會執行。
function aa (data,data1) {
console.log(this)
console.log(`${this.name}年齡${this.age}歲,愛吃${data}和${data1}`)
console.log(1)
}
var cat = {
name: '小希',
age: 2,
}
// 重點,apply 接收一個數組
aa.apply(cat, ['魚', '肉'])
/*
VM4856:2 {name: '小希', age: 2}
VM4856:3 小希年齡2歲,愛吃魚和肉
VM4856:4 1
*/
bind
調用后不會執行函數得到一個結果,而是直接返回一個新的函數。
function aa (data,data1) {
console.log('this::', this)
console.log(`${this.name}年齡${this.age}歲,愛吃${data}和${data1}`)
console.log(1)
}
var cat = {
name: '小希',
age: 2,
}
aa.bind(cat, ['魚', '肉']);
/*
輸出結果:
? aa (data,data1) {
console.log('this::', this)
console.log(`${this.name}年齡${this.age}歲,愛吃${data}和${data1}`)
console.log(1)
}
*/
測試傳遞多個散列參數
function aa (data,data1) {
console.log('this::', this)
console.log(`${this.name}年齡${this.age}歲,愛吃${data}和${data1}`)
console.log(1)
}
var cat = {
name: '小希',
age: 2,
}
// 重點
var r = aa.bind(cat, '魚', '肉');
r()
/*
輸出結果:
VM431:2 this:: {name: '小希', age: 2}
VM431:3 小希年齡2歲,愛吃魚和肉
VM431:4 1
*/
測試傳遞一個數組
function aa (data,data1) {
console.log('this::', this)
console.log(`${this.name}年齡${this.age}歲,愛吃${data}和${data1}`)
console.log(1)
}
var cat = {
name: '小希',
age: 2,
}
// 重點
var r = aa.bind(cat, ['魚', '肉']);
r();
/*
輸出結果:
VM5716:2 this:: {name: '小希', age: 2}
VM5716:3 小希年齡2歲,愛吃魚,肉和undefined
VM5716:4 1
*/
原文鏈接:https://blog.csdn.net/weixin_42728767/article/details/126155062
相關推薦
- 2022-08-28 go?zero微服務實戰處理每秒上萬次的下單請求_Golang
- 2024-03-09 【Spring Boot】實現全局異常處理
- 2022-11-23 Python?os.listdir與os.walk實現獲取路徑詳解_python
- 2022-05-06 C#迭代器方法介紹_C#教程
- 2022-03-03 【css】page-break-after 頁面打印分頁屬性
- 2022-07-22 python:實現打印從 0 到 n 的卡特蘭數算法(附完整源碼)
- 2022-07-11 跨域的五種解決方案
- 2023-11-22 fatal: unable to access ‘https://github.com/xxxxx/
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支