Hibop / Hibop.github.io

Hibop 个人博客
https://hibop.github.io/
23 stars 1 forks source link

关于一道综合性js面试题 #22

Open Hibop opened 6 years ago

Hibop commented 6 years ago

js难点汇总:

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)();

参考: http://chuansong.me/n/1520504847015

Hibop commented 6 years ago
var a = 0,
    b = 0;
function A(a){
    A = function (b){
        alert(a + b++);
    }
    alert(a++);
}
A(1);
A(2);

result: 1 4

  1. 闭包, 第一次调用A时, A函数被重新赋值alert(a+b++);
  2. 在初始A中,形参a其实是局部变量, 当重置A函数新A调用原来局部变量a,构成闭包, a局部变量被保存。
Hibop commented 6 years ago
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

Hibop commented 6 years ago
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