网站首页 > 知识剖析 正文
总结一句话:改变函数内部的 this 指向,并执行函数。
call、apply 是 Function 构造函数原型对象上的方法,所有的函数(包括call)都可以调用 call 和 apply。
call
先看一下原生call的效果(运行在浏览器环境)
let context = {
name: 'z'
}
// 全局环境, 用let变量不会挂在window上
var name = 'j'
function say(age,sex){
console.log(this.name+age+sex)
}
say.call(context,12,1) // z121
say.call(null,18,0) // j180
我们稍加分析,将成call做的事情拆解为三步:
- 先把方法say挂在call的第一个参数,context的属性下(context指上下文,this所指向的新执行环境)
- 执行 context.say(age, sex),并传入参数
- 删除 context.say,不能侵入性修改原数据
按照这三步我们复现一下 写一个myCall
Function.prototype.myCall = function(context) {
// 设置一个参数默认值,浏览器环境默认window,node环境是global
context = context ? context : window;
// 原函数调用call函数,所以this指向原函数本身,即 say
context.fn = this
// 获取除掉第一个context外的参数
let args = []
for(let i=1;i<arguments.length;i++){
args.push('arguments['+i+']')
}
// 调用函数
var result = eval('context.fn('+ args +')')
// 删除增加的属性
delete context.fn
// 返回执行结果
return result
}
执行一下
let context = {
name: 'z'
}
// 全局环境, 用let变量不会挂在window上
var name = 'j'
function say(age,sex){
console.log(this.name+age+sex)
}
say.myCall(context,12,1) // z121
say.myCall(null,18,0) // j180
完美复现,okkkk~~~
解释一下eval问题,之所以这样写,是因为之前还没有结构啊,Array.from类数组转数组语法什么的。eval遇到数组会调用 args.toString(),解析后是这样的
context.fn(arguments[1], arguments[2], ...)
apply
apply与call基本相同,只是额外参数是数组形式
Function.prototype.myApply = function (context,args){
context = context ? context : window
context.fn = this
// 判断是否传递额外参数,如果没有直接执行函数即可
if(!args) return context.fn()
var result = eval('context.fn('+ args +')')
delete context.fn
return result
}
bind
bind下篇文章讲,关注一下哈哈~~~
猜你喜欢
- 2024-11-13 “A妹”“碧梨”入围2020全英音乐奖最佳国际女歌手
- 2024-11-13 90后女生相亲50次仍单身,心理专家:这2招轻松搞定约会交谈
- 2024-11-13 三字男星嫖娼后续!录音内容毁三观,戴向宇成瓜主?多方回应来了
- 2024-11-13 吴亦凡鹿晗为黄子韬新歌打call 吴亦凡鹿晗黄子韬合体
- 2024-11-13 2019年这10部小说将被改编成电影 主演全都是熟面孔
- 2024-11-13 《歌手》首战Jessie J夺冠 张天排第二
- 2024-11-13 SNH48 GROUP偶像运动会圆满落幕 snh48 7senses偶像运动会
- 2024-11-13 蔡依林为Jessie J打call:跪!说不出话来了!
- 2024-11-13 JS 歌曲 花与剑 手游花与剑歌曲
- 2024-11-13 Snap call(快速跟注)的含义 snap judgement,if
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)