zoukankan      html  css  js  c++  java
  • 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.。。。。+

  • 相关阅读:
    Debian Linux 查看用户命令
    WPF 样式(Style)(2)
    SQLServer2012下更改数据库名字
    WPF 触发器Triggers
    随记
    网页打印总结(1)
    安装node.js,CoffeeScript,Express.js,mysql,jade
    javascript——this
    win8下IIS8.0下uploadifyv3.1上传文件超过30M,报HTTP Error(404)
    Linux软件安装常用方法(转载)
  • 原文地址:https://www.cnblogs.com/-youth/p/5554857.html
Copyright © 2011-2022 走看看