首页 > 代码库 > 有关this的两道问题

有关this的两道问题

1.var length=10;
function fn(){
console.log(this.length);
}
var obj = {
length:5,
method: function (fn) {
fn();
arguments[0]();
}
};
obj.method(fn);
obj.method(fn, 123);

打印的结果是10 1 10 1
分析:这里的obj.method(fn);,将一个函数传入进来, 执行fn()的时候对象变成了全局变量,所以 console.log(this.length)的时候就打印出了全局变量10。 arguments 的对象是arguments对象,arguments[0]指的是mathod函数的第一个对象,即fn,然后执行fn(),所以 console.log(this.length)时
,this就是method的函数的参数的个数

2.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();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

这个题的结果是:2 4 1 1 2 3 3

(1)Foo.getName直接有,不会再去进行加载,所以打印出来的是2;

(2)getName有两个,零级作用域上有两个函数,一个是Foo,一个是getName,由于现在一个是函数表达式,一个是函数声明,函数声明将会提升,然后函数表达式会将其覆盖,所以window上的getNameN函数,最终为var getName = function () {
console.log(‘4‘);
};所以打印出4

(3)先执行Foo,将里面隐式的全局函数getName释放,然后返回window对象,所以打印出1,同时将原来零级作用域上的getName函数覆盖。

(4)打印getName函数,此时的window对象上的getName函数已经覆盖为 getName = function () {
console.log(‘1‘);
};,所以打印出1;

(5)new( Foo.getName()) Foo不是函数,所以先执行Foo.getName(),打印出2;

(6)(new Foo()).getName(); Foo是函数,所以先执行new Foo(),找到原型对象,然后再执行getName(),即执行的是Foo.prototype.getName = function () {
console.log(‘3‘);
};,所以打印出来为3;

(7)new((new Foo()).getName())和上一题(6)类似,这里打印出3,然后new 3

有关this的两道问题