有关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

相关文章
相关标签/搜索