美文网首页
What's this?

What's this?

作者: 盖被吹空调 | 来源:发表于2017-02-21 02:16 被阅读0次

作为函数调用

在函数被直接调用时this绑定到全局对象。在浏览器中,window 就是该全局对象

console.log(this);
// Window

function fn1(){
    console.log(this);
}

fn1();
// Window

作为内部函数

函数嵌套产生的内部函数的this不是其父函数,仍然是全局变量

function fn0(){
    function fn(){
        console.log(this);
    }
    fn();
}

fn0();
// Window

作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象

function Person(name){
    this.name = name;
}
Person.prototype.printName = function(){
    console.log(this.name);
};
var p1 = new Person('Byron');

p1.printName();
// Byron

作为对象方法调用

函数可以作为对象的一个属性时,this 被自然绑定到该对象

var nick = 'aaa';
var obj1 = {
    nick: 'bbb',
    fn : function(){
        console.log(this.nick);
    }
};
var obj2 = {
    nick: 'ccc'
}

obj1.fn();
// bbb
obj2.fn = obj1.fn;
obj2.fn();
// ccc

DOM对象绑定事件

在事件处理程序中this代表事件源DOM对象(低版本IE有bug,指向了window)

document.addEventListener('click', function(e){
    console.log(this);
// document
    var _document = this;
    setTimeout(function(){
        console.log(this);
// window
        console.log(_document);
    }, 200);
}, false);

使用call和apply设置this

语法很简单,第一个参数都是希望设置的this对象,不同之处在于call方法接收参数列表,而apply接收参数数组

fn2.call(obj1);
fn2.apply(obj1);

caller

在函数A调用函数B时,被调用函数B会自动生成一个caller属性,指向调用它的函数对象,如果函数当前未被调用,或并非被其他函数调用,则caller为null

function fn4(){
    console.log(fn4.caller);
// null
    function fn(){
        console.log(fn.caller);
// 函数fn4
    }
    fn();
}
fn4();

arguments

  • 在函数调用时,会自动在该函数内部生成一个名为 arguments的隐藏对象
  • 该对象类似于数组,可以使用[]运算符获取函数调用时传递的实参
  • 只有函数被调用时,arguments对象才会创建,未调用时其值为null
 function fn5(name, age){
     console.log(arguments);
     name = 'XXX';
     console.log(arguments);
     arguments[1] = 30;
     console.log(arguments);
 }
 fn5('Byron', 20);
// ["Byron", 20]
// ["XXX", 20]
// ["XXX", 30]

callee

当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用

function fn6(){
    console.log(arguments.callee);
}
fn6();

匿名函数特好用

var i =0;
window.onclick = function(){
    console.log(i);
    if(i<5){
        i++;
        setTimeout(arguments.callee, 200);
    }
}
//0
//1
//2
//3
//4
//5

综合练习

var app = {
    init: function(){
        this.target = document.querySelector('#btn');
        this.bind();
    },

    bind: function(){
        var _this = this;
        // app
        setTimeout(this.sayHaha, 2000);
        // 因为没有匿名函数说以this=app
        this.target.addEventListener('click', function(){
            // app.target=#btn
            var self = this;
            // #btn
            this.innerText = '我被点了';
            // #btn
            _this.sayHello();
            // app
            setTimeout( function(){
                    self.innerText = '点我';
                    // btn
                    console.log(this);
                    // window
                    _this.sayGoodBye.call(self);
                    // 使用call的方法使得sayGoodBye的变为self,即#btn
        });


    },

    sayHello: function(){
        console.log('hello...')
        console.log(this);
        // 因为绑定在app上,所以this为app
    },

    sayGoodBye: function(){
        console.log('sayGoodBye...')
        console.log(this)
        // 使用call的方法使得sayGoodBye的变为self,即#btn
    },

    sayHaha: function(){
        console.log('say Haha...');
        console.log(this)
        // 匿名函数,this为Window
    }
};

app.init();

相关文章

网友评论

      本文标题:What's this?

      本文链接:https://www.haomeiwen.com/subject/tmcewttx.html