小结this指向问题

一、this指向函数的调用者,全局上下文默认this指向window, 严格模式下指向undefined。

1、普通函数 this指向window

function fn(){}
调用:
fn(); fn.call();

2、对象的方法 this指向对象obj

var obj = {
show:function(){}
}
调用:
obj.show();

3、构造函数 this指向fn这个实例对象

function Star(){}
调用:
var fn = new Star();

4、绑定事件函数 this指向函数的调用者,btn按钮对象

var btn = document.querySelector("button");
调用:
btn.onclick = function(){}

5、定时器函数 this指向的是window
6、立即执行函数 this指向的是window
7、箭头函数()=>{}

箭头函数自身是没有this的,会自动绑定外层this

二、可以改变this指向的方法bind()、call()、apply() ,及对比

bind()

第一个参数:this新指向
后面的参数:作为实参传给了新函数
bind()的执行结果:改变this指向新函数,只绑定,需要手动执行

call()

第一个参数:this新指向
后面的参数:作为实参传给了新函数
call()的执行结果:改变this指向新函数,并自动执行

apply()

第一个参数:this新指向
后面的参数:必须是数组,被自动解析之后,每个数据作为实参传给了新函数(覆盖新函数的arguments)
apply()的执行结果:改变this指向新函数,并自动执行

        var obj = {
            name:"admin",
            show:function(a,b){
                console.log("这是:" + this.name);
                console.log(a,b);
            }
        }       
        var obj2 = {
            name:"root"
        }       
        obj.show("hello","world");      
        obj.show.bind(obj2,"hi","js")();      //自行不执行,需要添加小括号执行 
        obj.show.call(obj2,"yes","css");        
        obj.show.apply(obj2,["oh","html"]);   //除一个参数,其他需要是数组

简单小结,若有疑问,欢迎留言~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容