第一题:
这是一道典型的对象调用函数,谁调用的,this就指向谁,o.fn()此时this指向o,因此this.a即o.a,所以输出结果为2
第二题
fun()是一个典型的函数直接加圆括号,所以其上下文环境为window,里面的this.a=2; this指向window,相当于定义了一个全局变量a=2,第一次fun()返回了一个内层函数,第二个()也是典型的函数直接加(),所以上下文也是window对象,其this是指向window的,所以结果为2.
由上面两题延伸出的知识点扩展:
函数身上有属性,函数内部想要得到有以下两种方法:f.call(f)以及arguments.callee,下面展示其中一种方法。
function f(){
console.log(this.a)
}
f.a=10;
f.call(f);
第三题
首先看语句arr0,这是一道典型的数组枚举出函数,然后调用,因此函数里面的this指向数组,所以this.length返回的是数组的长度,结果为2.
第二条该条语句表示fn2()运行得到的结果fn1()继续运行,arr1表示的是数组枚举出来然后运行,此时函数里的this是数组,返回了fn1,fn1直接加圆括号运行,this就是window对象,此时window.length,结果为0
知识点补充:
在定义一个对象的时候,如果值是表达式,在定义的时候就已经被执行掉了,比如:
var obj={
a:(function(){
console.log("hh")
})()
}
console.log("kl");//打印顺序为hh kl
第四题
var a=1;
var obj={
a:2,
fn:(function(){
this.a=3;
return function(){
return this.a;
}
})()
}
var fn=obj.fn;
var result1=obj.fn();
var result2=fn();
console.log(result1);
console.log(result2);
this.a=3的this指向window,所以相当于定义了一个全局变量a=3,obj.fn()里面的this指向obj,所以结果为2;
fn()里面的this指向window,所以结果为3。
以上是我总结的几道题,写在博客上,方便以后复习。