关于 JS 一些迥殊的点

变量提拔

所谓 变量提拔 即一切声明变量或声明函数都会被提拔到当前函数的顶部。

    var a = 1;
    function log(){
        console.log(a);
        var a = 2;
        console.log(2);
    }
    log();
    var a;
    console.log(a);

人人能够猜想下上面打印到控制台的音讯会是什么?

    效果分别是 : undefine,2 和 1

那末我们再看看下面这个代码打印出来会是什么呢?

    var a = 1;
    function log(){
        console.log(a);
        a = 2;
        console.log(2);
    }

    log()
    效果分别是 : 1 和 2

连系一下我们对变量提拔的定义,你或许已邃晓了。关于第一个Demo中,她终究实行的代码实际上是如许的

    var a = 1;
    function log(){
        var a;
        console.log(a);
        a = 2;
        console.log(2);
    }

    log()

所以终究打印出来的效果分别是 undefine 和 __2__,这就是变量提拔很简单,不是吗?然则你要保持警惕,由于他随时会让你吃大亏。

函数的声明体式格局

    var getName = function(){
        console.log('函数表达式');
    }

    function getName(){
        console.log('函数声明');
    }

    getName();

照样请人人想一想会打印出什么?

    宣布效果 : 函数表达式 

这就是两种不一样的声明体式格局带来的效果,关于 函数声明 JS会在优先剖析,确保一切挪用这个要领的处所不会报错,然则关于 函数表达式 只会在JS从上往下剖析的时刻才会,正式剖析,我们能够看下面代码会打印出什么。

    console.log(getName); // undefine

    var getName = function(){
        console.log('函数表达式');
    }

    console.log(getName); // 会打印出getName的要领

作用域

JS是没有块级作用域的(ES5之前),然则有函数作用域,我们看下面这两个Demo,看看二者的区分

    function add(){
        a += 10;
        return a;
    }

    var a = 30;

    console.log(add(a)+a);
    function add(a){
        a += 10;
        return a;
    }

    var a = 30;

    console.log(add(a)+a);

这是一道很基础的题目,当我们把两个Demo 同时写出来的时刻,我置信很多人是能够回答出准确答案的,下面宣布答案。

    第一个Demo : 80
    第二个Demo : 70

为何会获得如许的效果呢?我们看第一个Demo 函数内里的 a 实际上直接操纵window下面的,也就是全局环境。然则第二个Demo操纵的确切函数自身的形参,也就是自身的作用域,它的转变不会影响到全局环境的a

JS中声明类的要领有很多种,这里我就引见最典范的一种罢了

    function Animal(){
        this.name = "";
        var food = "";

        var eat = function(){
            console.log('eat');
        }

        this.run = function(){
            console.log('run');
        }
    }

    Animal.prototype.name = "小明";
    Animal.prototype.food = "穿山甲"

    var animal = new Animal();

    console.log(animal); // 会打印出什么属性?
    console.log(animal.name); // 效果会是什么?
    console.log(animal.food); // 那末这个呢?

起首这个触及到了闭包的观点,关于这个题目我在这里就不细致说了,给人人一个知乎链接,内里讲的答案异常的简单明了,记得要悉数看完,不要只关注高分项 JavaScript 里的闭包是什么?运用场景有哪些?,基础我要讲的都在这内里了。

    至于 animal.name 为何会是 "" ,而 animal.food 是穿山甲,实在很简单,对象关于prototype会是低优先,先找自身存不存在name这个属性,找不到就到prototype去找。
    原文作者:第三方x
    原文地址: https://segmentfault.com/a/1190000008357789
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞