有關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的函數的參數的個數this

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);
}prototype

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;get

(2)getName有兩個,零級做用域上有兩個函數,一個是Foo,一個是getName,因爲如今一個是函數表達式,一個是函數聲明,函數聲明將會提高,而後函數表達式會將其覆蓋,因此window上的getNameN函數,最終爲var getName = function () {
console.log('4');
};因此打印出4原型

(3)先執行Foo,將裏面隱式的全局函數getName釋放,而後返回window對象,因此打印出1,同時將原來零級做用域上的getName函數覆蓋。io

(4)打印getName函數,此時的window對象上的getName函數已經覆蓋爲 getName = function () {
console.log('1');
};,因此打印出1;console

(5)new( Foo.getName()) Foo不是函數,因此先執行Foo.getName(),打印出2;function

(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

相關文章
相關標籤/搜索