this大全,还有谁??????!!!!!!!

this在函数调用时创建,一般的对象没有this,全局window可以理解为一个函数,他有一个全局this
JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系。
函数里this的指向由函数的调用方式决定

不服就干,几个例子来说明函数的调用方式

var 变量 = 123
var 对象 = {
    变量: 456,
    函数: function () {
        var 变量 = 789
        console.log(this.变量)
    }
};
(对象.函数)(); 
//==>对象.函数()
(对象.函数 = 对象.函数)();
//var ret = (对象.函数 = 对象.函数);//执行括号里的赋值操作
//ret()
(对象.函数, 对象.函数)()
//var ret = (对象.函数, 对象.函数);返回最后一个
//ret()
function a(xx) {
    this.x = xx;
    return this
};
var x = a(5);//此时x 是window
var y = a(6);//此时x 是6
console.log(x.x);//x是6 6.6 undefine
console.log(y.x);//window.x是6
var 对象 = {
    函数一:function(){
        function 函数二(){
            console.log(this)
        }
        return 函数二()
    }
}
对象.函数一()//this是window,函数二虽然在函数一里面调用,但函数二前面没前缀,或者看做window.函数二(),所以函数二里的this就是window
var num = 20;
var obj = {
    num:30,
    fn:(function (num) {
        this.num *= 3;
        num += 15;
        var num = 45;
        return function () {
            this.num *= 4;
            num += 20;
            console.log(num);
        }
    })(num)
}
var fn = obj.fn;
fn();//65
obj.fn();//85
console.log(window.num,obj.num);//240,120
var o = {
    f: function () {
        console.log(this);
    },
    2: function () {
        console.log(this);
    }
};
o.f(); //o
o[2]();//o !!!!!!!!!!这种和上一个等价
var length = 10;

function fn() {
    console.log(this.length);
}
var obj = {
    length: 5,
    method: function (f) {
        f(); //10
        arguments[0](); //1  (arguments是一个伪数组对象,他的第一个参数是fn函数,他调用fn函数,所以this指的是arguments)
        arguments[0].call(this); //5(改变fn的指向,这里的this是obj)
    }
};
obj.method(fn);

箭头函数的this

箭头函数没有this,他的this是外层的this,外层的this一旦确定,这时候不管谁调用箭头函数,他的this都是原来确定的外层this,但是如果再改变外层的this,箭头函数的this跟着改变,

call,apply,bind方法指定this

函数.call(任意,函数参数,...)//call改变this会立即执行函数,第一个参数的类型不同改变的this指向也不同,如果是对象this就指向该对象,如果是字面量就转换成相应的对象this指向这个this,如果是null和undefined就是window
函数.apply(任意,[函数参数,...])
函数.bind(任意)//绑定后不会立即执行,啥时候再调用函数,函数里的this就是现在绑定的,==注意this只能改变一次==

posted @ 2020-12-02 19:21  丁同亚的博客  阅读(82)  评论(0编辑  收藏  举报