1. 程式人生 > >有關this的兩道問題

有關this的兩道問題

mat 進行 fun type n) eth window對象 new 有關

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的兩道問題