提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
友情链接:
这是我在政万通平台上的知识岛屿账号,我会不定时在平台发布一些有深度的技术文章,欢迎大家一起来学习交流:https://www.zwtoon.com/islandSearch
前言
分享学习js逆向路上遇到的一些js语法
一、关于js语法中call、apply、bind的用法和涉及到的this指向的问题。
1.call、apply、bind的用法:
- 都是对函数的操作,使用方式:函数.call
- 都是用来改变函数的 this 对象的指向的。
- 第一个参数都是 this 要指向的对象。
- 都可以利用后续参数传参。
- call 接受函数传参方式为:fn.call(this, 1, 2, 3)
- apply 接受函数传参方式为:fn.apply(this,[1, 2, 3])
- bind 的返回值为一个新的函数,需要再次调用: fn.bind(this)(1, 2, 3)
2.实际案例:
代码如下(示例):
function Animal() {
this.name = "cat";
this.showName = function () {
console.log(this.name);
}
}
function Dog() {
this.name = "dog";
}
var animal = new Animal();
var dog = new Dog();
animal.showName() //cat
animal.showName.call(dog); //dog
总结
上边的代码会输出两行,分别是 "animal"
和 "dog"
。
解释如下:
-
第一个输出
"animal"
:- 当调用
animal.showName()
时,this
关键字在showName
方法内部指向animal
实例。因为animal
是通过new Animal()
创建的,所以它的name
属性被设置为"animal"
。因此,console.log(this.name);
输出"animal"
。
- 当调用
-
第二个输出
"dog"
:- 当调用
animal.showName.call(dog);
时,Function.prototype.call
方法被用于调用animal
实例的showName
方法,但此时this
关键字在showName
方法内部被显式地设置为dog
实例。这意味着在showName
方法内部,this.name
实际上是在访问dog
实例的name
属性。因为dog
是通过new Dog()
创建的,并且其name
属性被设置为"dog"
,所以console.log(this.name);
输出"dog"
。
- 当调用
综上所述,第一个调用 animal.showName()
输出了 animal
实例的 name
属性值 "animal"
,而第二个调用 animal.showName.call(dog);
通过 call
方法将 this
绑定到 dog
实例,从而输出了 dog
实例的 name
属性值 "dog"
。