// this关键字是一个非常重要的语法点。 毫不夸张地说, 不理解它的含义, 大部分开发任务都无法完成。
// 前一章已经提到, this可以用在构造函数之中, 表示实例对象。 除此之外, this还可以用在别的场合。 但不管是什么场合, this都有一个共同点: 它总是返回一个对象。
// 简单说, this就是属性或方法“ 当前” 所在的对象。
//第一题
var name = "2222";
var a = {
name: "111",
show: function() {
console.log(this.name) //此时this在show方法中使用此时的this指向就是对象a
}
}
var fun = a.show; //此时将this的指向改变为fun对象
a.show(); //此时的this指向是a所以输出就是a中的name
fun(); //由于this指向的改变此时输出就是全局变量
var b = {
name: "333",
show: function(func) { //这里进行了传参操作,
func();
}
}
b.show(a.show); //此时将this指向改变为b,虽然是在b内,
// //但是func在执行的时候并没有绑定在某个对象上,相当于是全局状况下调用,所以打印 ”222“
b.show = a.show; //这里将a对象绑定给bthis指向随之改变巍峨b中的name
b.show(); //输出值为333
//第二题
var a = "123"; //全局变量a
function text() { //定义一个函数
var a = "456"; //定义一个内部变量a
this.a = "789"; //此时的This指向就是text 声明函数的作用域中,但是由var 声明的变量优先级比this的大
console.log(a); //所以输出的就是内部变量a
}
text();
var a = 123; //全局变量a
function text() { //声明一个函数
this.a = 234; //此时的This在text中声明指向就是text,此时内部的a是234
console.log(a); //输出一下a
}
text(); //调用函数输出内部的值,并没有访问全局变量
var a = 123; //全局变量
function text() {
this.a = 456; //此时的This指向就是text
console.log(a) //输出a
}
new text(); //new 的作用方式1.自己创建一个空对象2.把This改变到空对象上,把所有属性挂载给空对象,
//在return回来值赋值给空对象。 此时由于将this的指向改变到了window所以输出就是全局变量。
//第三题
var length = 10; //全局变量a
function fn() {
console.log(this.length) //此时This出现在fn对象中
}
fn(); // 此时的this指向就是对象fn但是函数内部并没有值 所以找到的是window中的全局变量
let Person = {
len: 5,
say: function() {
fn(); // 此时调用fn由于是var声明的函数任意位置都可以调用,此时的This指向没有改变所以输出还是10
arguments[0](); //这里输出的是 arguments.length=1;
}
}
Person.say(fn); //此时的this指向由fn改变为say,调用是输出的是arguments.length=1;