Javascript:this关键字

this

this 是 JavaScript 语言的一个关键字。它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。

function test() {
    this.x = 1;
}

this 的多种指向:

在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。

  • 在对象方法中, this 指向该方法所属的对象。
  • 单独使用 this, this指向全局对象。
  • 函数使用中,this 指向函数的所属者。
  • 严格模式下函数是没有绑定到 this 上,这时候 this 是 undefined。
  • 在 HTML 事件中,this 指向了接收事件的 HTML 元素。
  • 类似 call() 和 apply() 方法可以将 this 引用到任何对象。

this指向如何发生改变?

  • 一般想到的是call和apply方法: 将一个对象作为call或者apply的第一个参数,this将会被绑定到这个参数对象上
var obj = {
    parent:'男'
};
var parent = '28';
function child(obj){
    console.log(this.parent);
}
child(); // 28  
child.call(obj); //男
child.apply(obj); //男
  • bind方法: 调用f.bind(someObject)会创建一个与f具有相同函数体和作用域的函数,但是在这个新函数中,this将永久地被绑定到了bind的第一个参数,不管函数是怎样调用的。
function f(){
    return this.a;
}
var g = f.bind({a:"js"});
console.log(g()); // js

var h = g.bind({a:'html'}); // this已经被绑定bind的第一个参数,不会重复绑定,输出的值还是js
console.log(h()); // js

var o = {a:css, f:f, g:g, h:h};
console.log(o.f(), o.g(), o.h()); // css, js, js
  • 箭头函数: 在箭头函数中,箭头函数的this被设置为封闭的词法环境的,换句话说,箭头函数中的this取决于该函数被创建时的环境。
var objProject = this;
var foo = (() => this);
console.log(foo());  // window
console.log(objProject);  // window
console.log(foo() === objProject ); // true
// 作为对象的一个方法调用
var obj = {foo: foo};
console.log(obj.foo() === objProject ); // true
// 尝试使用call来设定this
console.log(foo.call(obj) === objProject ); // true
// 尝试使用bind来设定this
foo = foo.bind(obj);
console.log(foo() === objProject ); // true
  • 作为对象的方法调用时: 当函数作为对象的方法被调用时,this指向调用的该函数的对象
var obj = {
    a: 37,
    fn: function() {
        return this.a;
    }
};
console.log(obj.fn());  // 37
  • 作为构造函数: 当一个函数用作构造函数时(使用new关键字),它的this被绑定到正在构造的新对象。
function C(){
    this.a = 37;
}

var o = new C();
console.log(o.a); //  37
function C2(){
    this.a = 37;
    return {a:38};
}
o = new C2();
console.log(o.a); //  38,手动设置了返回对象
  • 作为DOM事件处理函数 当函数被用作事件处理函数时,它的this指向触发事件的元素
// 被调用时,将关联的元素变成蓝色
function bluify(e){
    console.log(this === e.currentTarget); // 总是 true

    // 当 currentTarget 和 target 是同一个对象时为 true
    console.log(this === e.target);        
    this.style.backgroundColor = '#A5D9F3';
}
  // 获取文档中的所有元素的列表
  var elements = document.getElementsByTagName('*');

  // 将bluify作为元素的点击监听函数,当元素被点击时,就会变成蓝色
  for(var i=0 ; i<elements.length ; i++){
  elements[i].addEventListener('click', bluify, false);
}
全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
09-22 09:42
门头沟学院 Java
牛客37185681...:马德,我感觉这是我面过最恶心的公司,一面是两个女hr,说什么实习前几个月属于试用期,试用期过了才能转成正式实习生,我***笑了,问待遇就是不说,问能不能接受全栈,沙币公司
如果可以选,你最想去哪家...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务