**
this以及apply,call,bind之间的区别
-
关于this对象
每个函数都有自己的执行环境。全局执行环境是最外围的一个执行环境。this指向的就是当前代码所在的执行环境。
-
它们之间的关系
- 在浏览器里,在全局范围内this 指向window对象
- 在函数中,this永远指向最后调用他的那个对象
- 构造函数中,this指向new出来的那个新的对象
- call、apply、bind中的this被强绑定在指定的那个对象上
- 箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来
- apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参
-
** 改变this指向的几种方法以及之间的区别:**
1、apply()和call()
每个函数都包含两个非继承而来的方法: appy()和call()。这两个方法的用途都是在特定的作用域中调用函数,然后可以设置调用函数的this指向。
1 、apply()方法接受两个参数,一是作用域,二是参数(可以是数组也可以是arguments对象)
2、call()的使用和apply()基本是一样的,不同的是参数的传递,call()必须明确的传入每一个参数。
2、bind()
ECMAScript还定义了一个叫bind()的方法。这个方法会创建一个函数的实例,其this值会被绑定给传入bind()函数的值。
区别:
1,传参不同:call通过“,”分隔的形式传递参数,前面是函数名
例:函数名.call(目标对象,参数一,参数二)
apply参数使用数组进行传参
例:函数名.apply(目标对象,参数一,参数二)
bind传参“,”分隔开,因为bind返回的是一个函数所以调用要加上括号
例:函数名.bind(目标对象,参数一,参数二)()
2,函数是否执行:首先呢call和apply都是直接调用的,而bind上需要加上小括号才能调用
call apply实现原理
call实现原理:call的原理是基于函数来实现的,
主要做的事情是,给目标对象添加一个临时事件,实现后删除这个临时的事件,这个方法用到
了argument来接收参数,在接收参数的时要去掉参数的第一个obj事件,利用eval执行字符串
的方法
apply实现原理:apply基本是与call一样的实现原理,不过在接受参数的for循环时,它的参数是一个数组所
已不用去删除第一个参数就可以了