1.
var func1={
name:"a",
test: function(){
alert(this.name);
}
}
name="global";
func1.test();
func=func1.test;
func();
function func2(){
var name="func2";
func();
}
func2();
输出结果是:a , global ,global ;
解析:执行func1.test()时,this的指向func1,因此输出a;执行func()时,func引用test(),test()函数的作用域链最顶端是自己的活动对象,下一个就是全局作用域,在自己的活动对象里找不到name,顺着作用域链找到全局作用域中的global;func2()原理与func()执行时相同。
2 .
var xxx=1234;
function test(xxx){
alert(xxx);
var xxx=123;
function xxx(){}
alert(xxx);
}
test(444);
输出结果:1.function xxx(){} 2. 123
解析:
这主要考察了函数执行时初始化顺序:函数被执行时,首先创建执行环境(执行上下文),构建该环境时,1.首先创建arguments变量,包含了传入的参数,2 .创建创建作用域链 ,3 。初始化变量,首先会初始化函数的形参表,值为arguments里面中对应的值,如果arguments中没有对应的值,则形参为undefined ,4。初始化内部函数 ,5, 初始化函数内部的局部变量(undefined) 6. 最后当执行环境创建成功后,局部变量赋值 。
因此,在执行test(444)时,xxx为形参,值为444;进入test()函数时,首先初始化function xxx(){},此时xxx为function;接下来执行到alert(xxx),输出function xxx{};向下执行到var xxx=123,此时xxx=123,alert(xxx),输出123.
3.
if(!("a" in window)){
var a =1;
}
alert(a);
输出:undefined;
解析: 刚开始a 为undefined ,undefined in window 返回true ,所以它是进不了if()
4.
var a=1,
b=function a(x){
x&&(--x);
};
alert(a);
输出:1
解析: 方法a()的调用只能在function a(){}的内部调用,外部调用只能调用b();
5.
function superType(){
a="global";
this.b="xxx";
}
var c=new superType();
alert(a);
alert(b);
解析:第一个输出global 第二个报错,因为this指向了c。
6.
var condition=true;
if(conditon){
function() sayHi{
alert("Hi");
}
}else{
function sayHi(){
alert("Yo");
}
}
解析:除了Firefox输出Hi之外,其他的都输出Yo;
7.
function b(x, y ,a){
arguments[2]=10;
alert(a);
}
b(1,2,3);
解析:输出10,arguments每个值和形参是引用关系。