js中的this
        【摘要】 默认绑定当函数直接使用不带任何修饰的函数引用进行调用时,则绑定到全局对象或 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)