this
何意?在英文中this
是一我的称代词,表示这个的,具体指哪一个?不肯定,只有在具体的语境中才可肯定,在编程语言中this
也有一样的相似特性。
在js中this
是一个关键字,它不能被当作变量、属性
,也不能够进行赋值
操做。this
随着函数使用场景的不一样,而发生变化。this
是当前执行上下文中的一部分。javascript
this
永远指向函数的调用者
。独立调用
时,this指向全局对象window
(非严格模式),undefined
(严格模式)对象的方法
被调用时,this指向该对象// 声明一个函数 function show(){ console.log(this); } // 声明一个对象(变量) var obj={ _show:show } // 独立调用 show(); // window(非严格模式) undefined(严格模式) // 做为某个对象的方法调用 show._show(); // obj // 做为构造函数被调用,指向对象实例 var s = new show(); // this->s // 做为事件处理函数调用 var aLink=document.getElementById("J-link"); // 事件处理函数中,this指向触发事件的DOM对象 aLink.onclick=show; // this->aLink
call()
,apply()
咱们可使用这两个方法来显示更改函数中this的指向,
java
call、apply
这两个函数的共同特色:改变并当即执行
。
区别就是传参方式不一样编程
call
是一个一个传入apply
是传入一个数组,一次性传完。bind()
,该方法也是强制更改this指向。可是bind和call、apply的区别是bind更改this后不会当即执行
,它会返回一个新函数
。
bind传参也是一个一个的传入数组
特别注意:
call/apply若是更改成原始值的null、undefined
,则this->window
call/apply若是更改成原始值的Number、String、Boolean
,则this->对应的包装对象
// 声明一个对象(变量) var obj={ name:"tom", age :20 }; // 声明一个函数 function show(a, b){ console.log(this, a, b); } // 独立调用 show(1, 2); // this->window(非严格模式) this->undefined(严格模式) // 强制更改this指向为obj,并当即执行该函数 show.call(obj, 1, 2); // this->obj show.apply(obj, [1, 2]); // this->obj // 强制更改this指向obj,不会当即执行,它返回一个新函数,须要去主动执行这个新函数 show.bind(obj, 1, 2)(); // this->obj