this指向了谁? 看函数在执行的时候是如何调用的, 1 如果这个函数是用普通函数调用模式来进行调用,它内部的this指向了window 2如果一个函数在调用的时候是通过对象方法模式来进行调用,则它内部的this就是我们的对象 3 如果一个函数在调用的时候通过构造函数模式调用,则它内部的this指向了生成的实例 4 如果这个函数是通过方法借用模式调用,则这个函数内部的this就是我们手动指定this。
//第1题
function Fn() {
console.log(this);
}
Fn(); //window 普通函数调用模式
new Fn(); //{} 构造函数调用模式
Fn.apply(Fn); // Fn的函数体 方法借用模式
//第2题
var o = {
f: function() {
console.log(this);
},
2: function() {
console.log(this);
console.log(this.__proto__ === o[2].prototype);
}
};
o.f(); //o 对象调用模式
o[2](); //o 对象调用模式
new o[2](); //存疑,存在着优先级的问题 {} 通过构造函数模式进行调用
o.f.call([1, 2]); //[1,2] call方法进行方法借用。
o[2].call([1, 2, 3, 4]); // [1,2,3,4] call方法进行方法借用
//第3题
var name = "out";
var obj = {
name: "in",
prop: {
name: "inside",
getName: function() {
return this.name;
}
}
};
console.log(obj.prop.getName()); //对象调用模式来进行调用 obj.prop.name 'inside'
var test = obj.prop.getName; // 把test这个变量指向了obj.prop.getName所在的内存地址。
console.log(test()); //普通函数模式来进行调用 window 'out'
console.log(obj.prop.getName.apply(window)); //方法借用模式 'out'
console.log(obj.prop.getName.apply(this)); //方法借用模式 'out'
console.log(this === window); //true
//第4题
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(f) {
console.log(this);
f(); // f在调用的时候是什么调用模式?普通函数调用模式 window.length 10
arguments[0](); // 通过什么模式来进行调用的。执行之前有[]和.就是对象调用模式。
//arguments是一个类数组,也就是一个对象,就是通过arguments来进行调用的
//arguments.length实参的数量。实参长度是1
//通过arguments对象进行调用,因此函数内部的this是 arguments
// 如果一个函数在调用的时候它前面有call和apply那么就肯定是方法借用模式调用
arguments[0].call(this);
// 调用method方法是通过obj.method 因此在这里的this就是 obj
//通过call方法把fn内的this指向了obj
// 输出obj.length 5
}
};
obj.method(fn);
//第5题
function Foo() {
getName = function() {
console.log(1);
};
return this;
}
Foo.getName = function() {
console.log(2);
};
Foo.prototype.getName = function() {
console.log(3);
};
var getName = function() {
console.log(4);
};
function getName() {
console.log(5);
}
//请写出以下输出结果:
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName(); //3
// new Foo()创建了一个构造函数,然后这个函数再去访问getName这个函数,
//对它进行调用
/*console.log(new Foo().getName)*/
/*var o = new new Foo().getName(); //
console.log(o.__proto__===Foo.prototype.getName.prototype)*/
//用new Foo创建出来了一个实例,然后这个实例去访问 (new Foo().getName)
/*console.log(new new Foo().getName())
console.log(new Foo().getName())*/
/*function Foo() {
getName = function () {
console.log(1);
};
return this;
}
var getName;
Foo.getName = function () {
console.log(2);
};
Foo.prototype.getName = function () {
console.log(3);
};
getName = function () {
console.log(4);
};
//请写出以下输出结果:
Foo.getName();// 2
getName();//4
/!* Foo().getName();//!*!/
window.getName()//1
getName();//1
/!* var o = new Foo.getName();//2
console.log(o);// {}
console.log(o.__proto__===Foo.getName.prototype)//true*!/
new Foo.getName();// 2
new Foo().getName();//
new new Foo().getName();*/
//第6题
var obj = {
fn: function() {
console.log(this);
}
};
obj.fn(); //obj
var f = obj.fn;
f(); //window
console.log(f === obj.fn); // true
// f和obj.fn是同一个函数,但是他们在调用的时候使用的函数调用模式不同,因此,它们内部的this指向也就不同。
// #7题
var arr = [
function() {
console.log(this);
}
];
arr[0](); //数组本身
//数组也是一个复杂数据类型,也是一个对象,那用数组去调用函数,使用的模式就是对象方法调用模式。
function f() {
console.log(this);
}
function fn() {
console.log(arguments); // 类数组,也是就一个对象 [0:function f(){}]
console.log(this); // window
arguments[0]();
console.log(arguments[0]); //内部的this就是arguments
// 通过arguments对f这个方法进行调用,使用的是对象方法调用模式。
}
fn(f);
// #8题
function SuperClass() {
this.name = "women";
this.bra = ["a", "b"];
}
SuperClass.prototype.sayWhat = function() {
console.log("hello");
};
function SubClass() {
this.subname = "you sister";
SuperClass.call(this);
}
var sub = new SubClass();
console.log(sub.sayWhat());
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。