Javascript中this的用法

2018-02-06  本文已影响0人  前端工程狮_jam

我们在写js时,特别是用到回调函数时,经常会发现this指代的对象总是可能脱离自己的思路而发生改变。面向对象语言的特性告诉我们this始终指代它的调用者,而在js中回调函数中内部的this默认指向全局环境即最终上下文,所以很多时候我们不作this对象的声明绑定,就会发生指向错误,找不到我们想要的值。

function test(){
    this.a = 1;
    console.log(a);
}
test(); //1
console.log(a);  //1
console.log(this.a); //1
console.log(window.a); //1

//局部变量
function test(){
    var a = 1;
    console.log(a);  //1
    console.log(this.a); //undefined
}
test();
function test(){
    console.log(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1
var x = 2;  
function Test() {     
    this.x = 1;  //为了表明这时this不是全局对象
}  
var o = new Test();  
console.log(o.x); // 1
console.log(this.x); //2
function Test() {   
    this.b = 1; //this = Test{}
    return {
        a: 2
    }
}  

var o = new Test();  
console.log(o.a); // 2
console.log(this.b); //undefined

//在JavaScript构造函数中:如果return值类型,那么对构造函数没有影响,实例化对象返回空对象;如果return引用类型(数组,函数,对象),那么实例化对象就会返回该引用类型;
function Super(a){  
    this.a=a;  
    return 123;  
}  
Super.prototype.sayHello=function(){  
     console.log("Hello")  
}  
function Super1(a){  
     this.a=a;  
     return {a:2};  
}  
Super1.prototype.sayHello=function(){  
     console.log("Hello")  
}  
console.log(new Super(1));      //返回Super{a:1},有原型方法sayHello  
console.log(new Super1(2));     //返回Object{a:2},没有原型方法sayHello  
function foo() {
    // this.b = 1; //this = Test{}
    return (a) => {
        console.log(this.a);
    };
}

var obj1 = { a: 2 };
var obj2 = { a: 3 };

var bar = foo.call(obj1);  
bar.call(obj2); //  2
上一篇 下一篇

猜你喜欢

热点阅读