this的绑定与js的词法作用域不同,更接近于动态作用域。
js共有以下5种绑定规则
- 默认绑定
- 隐式绑定
- 显示绑定
- 硬绑定
- new 绑定
下面分别来看下这5中绑定方式
- 默认绑定
默认绑定是🈯️没有适用的其他任何绑定规则的时候,我们就认为是默认绑定。默认绑定this指向全局作用域或者undefined,取决于是否是严格模式。代码如下
let a = 2
function foo(params) {
console.log(this.a);
}
//严格模式
foo()//undefined
//非严格模式
foo()//2
2.隐式绑定
隐式绑定是指this绑定到了上下文对象上。隐式绑定只会将this绑定到上级,不会越低。并且隐式绑定存在绑定丢失的情况,如下的bar()。这是后this指向了全局作用域,隐式绑定丢失,变成了默认绑定。
let a = 2
function foo(params) {
console.log(this.a);
}
obj = {
a:10,
foo:foo
}
let bar = obj.foo
obj.foo()//10
bar()//2
3.显式绑定
指利用 call() 和 apply()方法进行this绑定。call和apply的区别在于参数的不同。代码略
4.硬绑定
指利用bind()方法进行this绑定,使用bind()之后,this的指向将无法更改。bind()和call()、apply()的区别是bind()会返回一个this指向写死的函数,之后无论怎么调用这个函数,this的指向都不会被改变。call和apply是在函数在被调用的时候临时改变this的指向,不影响之后的行为。**bind更安全,call更灵活~~~~
let obj1 = {
a:2
}
let obj2 = {
a:3
}
//使用bind()将函数内部的this绑定到obj1上
let fn = function (params) {
console.log(this.a);
}.bind(obj1)
fn()//2
//使用call在函数被调用的时候改变this的指向
let fn1 = function (params) {
console.log(this.a)
}
fn1.call(obj1)//2
fn1.call(obj2)//3
5.new 绑定
js 中并不存在 ‘构造函数’ 有的只是对函数的构造调用,new 操作符号试用于所有的普通的函数。把首字母大写的函数当成构造函数只是一种约定俗称的人习惯而已。
使用 new 来调用函数的时候,会构造一个新的对象并把它绑定到被调用函数的this上
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。