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