Hibop.github.io
Hibop.github.io copied to clipboard
关于一道综合性js面试题
js难点汇总:
- 变量定义提升
- 函数定义和函数声明
- this指针指向
- 运算符优先级
- 原型、继承
- 全局变量污染
- 对象属性及原型属性优先级
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//答案:1-7问
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3
解析:
1问: 静态属性访问 2问: 函数定义和函数声明 3问: 函数执行后修改外层getName变量,然后返回this【非new】指向的是window 难度【4星】 4问: 联系3问重写 5问: 优先级 new (Foo.getName)() 实例化无this和返回值 函数 实际就是执行函数 6问: (new Foo()).getName() 实例化后有返回值 返回值分引用类型和基本类型 返回this和无返回值 最后都是返回的实例化对象 7问: 优先级new ((new Foo()).getName)();
var a = 0,
b = 0;
function A(a){
A = function (b){
alert(a + b++);
}
alert(a++);
}
A(1);
A(2);
result: 1 4
- 闭包, 第一次调用A时, A函数被重新赋值alert(a+b++);
- 在初始A中,形参a其实是局部变量, 当重置A函数新A调用原来局部变量a,构成闭包, a局部变量被保存。
var n = 0;
function a(){
var n = 1;
function b(){
n++;
alert(n);
}
b();
return b;
}
var clusure = a();
clusure();
alert(n);
result: 2 3 1
var add = function (m) {
var temp = function (n) {
return add(m + n);
}
temp.toString = function () {
return m;
}
return temp;
};
add(3)(4)(5); // 12
add(3)(6)(9)(25); // 43
- 作用域;
- 交替;
- toString;