• js中的预解释


    在js中,带var 和function关键字的需要预解释:

    那什么是预解释?就是在js代码执行之前,先申明好带有var 关键字和带有function关键字的变量,在内存里先安排好。但是带有var关键字的和带有function关键字的预解释是有区别的:

    1.带有function关键字的,在整个js脚本执行之前,就已经把函数名在内存里安排好了,并且给这个函数名赋值了,就是把函数体也赋值给了函数名;

    例如:fn1();

    function fn1(){alert('this is fn1')};

    当你在调用的fn1的时候,fn1已经申明并且赋值了,哪里都可以调用;

    2.带有var关键字的,在js申明的时候只是申明有这个变量了,不给赋值,在预解释完成之后运行js代码的时候才给赋值;

    例如:

    console.log(a)//undefined

    var a='123';

    console.log(a)//123

    在预解释的时候只是申明了这个变量a,没有给a赋值,所以第一个打印出来的是undefined

    第二次打印的时候,a已被赋值,所以他的结果是123;

    下面是一道面试题:

    var m=0;

    var n=1;

    function fn(){

        alert(n);

        alert(m);

        n=4;

       var  n=5;

       alert(n)

    }

    fn();

    请问输出结果是什么?

    这个面试题主要考的就是作用域和预解释。

    首先预解释m,n,fn;

    接着执行代码:给m赋值0,给n赋值1,执行函数fn;

    执行函数fn的时候,在fn这个作用域里还要一次预解释:

    首先申明变量n;

    接着执行函数体里面的语句:

    alert(n),这个n是哪里的n?首先要在当前作用域里面找这个n,由于上一步在这个函数作用域内已经申明了这个n,n此时还是未定义,所以此时输出的是undefined;

    接着alert(m),这里的m是哪个m?首先还是在当前的作用域里面找,没有找到,继续往上一级作用域(window)找,结果在上一级作用域里面找到了m,这个已经是被赋值了,所以输出为1;

    接着n=7,这个n被赋值了4,代码继续执行,n又被赋值为5,

    接着又有个alert(n),此时的n就是这个函数的私有作用域里面的n,而且被赋值为6.所以alert(n)是6.。。。。+

  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/-youth/p/5554857.html
Copyright © 2020-2023  润新知