一道考察函数的综合题

考点:函数和类、原型链、运算符优先级、作用域、变量提升

解析

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>funciton</title>
</head>
<body>
<script>

    function Foo() {
        getName = function () {
            console.log(1);
        };
        return this;
    }
    Foo.getName = function () {
        console.log(2);
    }
    Foo.prototype.getName = function () {
        console.log(3);
    }
    var getName = function () {
        console.log(4);
    }
    function getName() {
        console.log(5);
    }

    Foo.getName(); //2
    // 在js中函数本身也是一个对象,是对象就可以声明方法

    getName(); //4
    // 这个点考察变量提升,相当于如下
    // var getName;
    // function getName() {
    //     console.log(5);
    // }
    // 下面的赋值会覆盖掉上面的函数声明
    // getName = function () {
    //     console.log(4);
    // }

    Foo().getName(); //1
    // 返回的this指的window对象,而getName因变量提升是一个全局变量
    // 相当于window.getName()

    getName(); //1
    // 在上一环节中,getName已经被重新赋值

    new Foo.getName(); //2
    // .的优先级高于new
    // 相当于 new function () { console.log(2); } ();

    new Foo().getName(); //3
    // 先运算 . 左边的部分
    // new Foo() 是一个对象
    // 这个上实例上有getName方法
    
    new new Foo().getName(); //3
    // 相当于 new foo.getName()
    // 调用实例下面的方法
</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_41900808/article/details/88426994
今日推荐