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只能改变一次==