網站首頁 編程語言 正文
介紹
- 相同點:
都是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
相關推薦
- 2023-10-11 小程序|頁面傳參的三種方式
- 2022-09-17 C++中cin的返回值問題_C 語言
- 2023-01-13 Python?CNN卷積神經網絡實戰教程深入講解_python
- 2022-07-29 使用React?Router?v6?添加身份驗證的方法_React
- 2022-05-01 c++隱式類型轉換存在的問題解析_C 語言
- 2022-03-27 Android?Studio實現井字游戲_Android
- 2022-05-22 ansible管理工具的環境及部署安裝_服務器其它
- 2022-08-18 python上下文管理器使用場景及異常處理_python
- 最近更新
-
- 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同步修改后的遠程分支