js面试程序题及详解

题目都来自论坛、博文,经本人用chrome中的console再次测验得出。不足之处请指正~~

1.

var f = function g() {
        return 23;
    };
typeof g(); 

error;  运行f()为23;

2.

(function (x) {
    delete x;
    return x;
})(1);
delete操作符用来删除对象的属性,删不掉的包括:
1.变量;  //var name = "Lily";
2.原型当中的变量;  //fun.prototype.age = 18;
3.函数
4.函数内建的arguments对象;

答案:1

3.

(function f(f) {
    return typeof f();
})(function () {
    return 1;
});

“number”

4.

var a = 1;
function hi(){
    alert(a);
    var a;
}
hi();

答案:undefined

5.javascript词法分析、连续赋值

var foo = {n:1};
var bar = foo;
foo.x = foo = {n:2};
console.log(foo.x); 
console.log(bar.x);

答案:undefined和{n:2}

考点:词法分析、执行顺序、运算符优先级等

6.词法分析

function a(b){
   alert(b);
   function b(){
       alert(b);
   }
   b();
}
a(1);

答案:弹出两个

function b(){
alert(b);
}

分析过程:
形成活动对象AO={}
分析形参,--> AO={b:undefined}; 分析传参,--> AO={b:1}
分析变量声明var,没有
分析函数声明,AO.b=function(){alert(b);},执行覆盖操作
词法分析
词法分析主要分为3步:
第1步:分析形参
第2步:分析变量声明
第3步:分析函数声明
如果存在函数嵌套,则从外往内进行词法分析

具体步骤:
在函数执行的一瞬间,产生一个空的 Active Object(活动对象),下面简称AO
AO对象初始化
2.1 函数声明的形参,形成AO的属性,默认值是undefined,
2.2 接收实参,给刚刚形成AO的属性的形参赋值
var声明、函数声明均被提升到函数体顶部(若var声明、函数声明同名,则函数声明将覆盖变量声明),注意,var声明只提前了声明部分,而函数声明提前了整个函数定义。
分析var声明变量!如 var age;(变量的值是在运行时期决定)
4.1 如果AO上没有age属性,则给AO添加age属性,默认值是undefined
4.2 如果AO上有age属性,则不做任何操作。
分析函数声明!如 function foot(){}
5.1 如果AO上没有foot属性,则把函数赋给AO.foot属性
5.2 如果AO上有foot属性,则会直接覆盖,把函数赋给AO.foot属性(因为:若var声明、函数声明同名,则函数声明将覆盖变量声明)
依据此时AO的值,自上而下执行代码 

7.this作用域

var  length = 10;
var obj1 = {
    length:6,
    method:function(){
       console.log(this.length);
    }
}
 
var obj2 = {
    length:3,
    method:function(fn){
        fn();
        arguments[0]();
    }
}
obj2.method(obj1.method,obj2.method);
//输出是:10 2
//第一个因为在obj2的method中直接执行函数,没有指定作用域的函数,不论在哪里执行,其this永远指向window;
//第二个因为调用arguments,函数的this指向了arguments对象,arguments对象的长度是2
var arr = [obj1.method,obj2.method];
arr[0]();
//输出的是2,是该数组的长度,因为这个函数的命名空间被限定在了array中,因此this指向的是array

posted @ 2016-06-30 19:19  简惬  阅读(563)  评论(0编辑  收藏  举报