js中的this

举报
小妖现世 发表于 2021/08/13 00:36:20 2021/08/13
【摘要】 默认绑定当函数直接使用不带任何修饰的函数引用进行调用时,则绑定到全局对象或 undefined(严格模式时)上function foo() { console.log(this.a);}var a = 2;foo();//2隐式绑定隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象function foo() { console.log(this.a);}var...

默认绑定

当函数直接使用不带任何修饰的函数引用进行调用时,则绑定到全局对象或 undefined(严格模式时)上

function foo() {    
  console.log(this.a);
}

var a = 2;
foo();//2

隐式绑定

隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象

function foo() {    
  console.log(this.a);
}

var obj2 = {
    a: 42,
    foo: foo
};

var obj1 = {
    a: 2,
    obj2: obj2
}

obj1.obj2.foo();//42

注意:对象属性引用链中只有上一层或者说最后一层在调用位置中起作用

 隐式丢失

被隐式绑定的函数会丢失绑定对象,就是说会默认绑定,从而把 this 绑定到全局对象或 undefined 上

function foo() {    
  console.log(this.a);
}

var obj = {
  a: 42,
  foo: foo
};

var bar = obj.foo; // 函数别名
var a = "oops";

bar(); // "oops"
// 传入回调函数时
function foo() {    
  console.log(this.a);
}

function doFoo(fn) {
  // fn 其实引用的是 foo
  fn(); // <-- 调用位置
}

var obj = {
  a:42,
  foo: foo
};

var a = "oops";
doFoo(obj.foo);// oops
// setTimeout()也会丢失 this 绑定
function foo() {    
  console.log(this.a);
}

var obj = {
  a:42,
  foo: foo
};

var a = "oops";
setTimeout(obj.foo, 100);

回调函数丢失 this 绑定非常常见

 显式绑定

利用 call(),apply()

function foo() {    
  console.log(this.a);
}

var obj = {
  a:2
};

foo.call(obj); //2

区别在于第二个参数,call()是依次输入参数,而apply()是一个参数数组


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。