11-变量声明提升和预解析

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

<script>
    //预解析:js的解析器在页面加载的时候,首先检查页面上的语法错误。把变量声明提升起来。
    //变量值提升变量名,不提升变量值。而用function直接定义的方法是整体提升。
    //1.查看语法错误。
    //2.变量声明提升和函数整体提升(变量声明提升的时候,只提升变量名,不提升变量值)
    //3.函数范围内,照样适用。
    var aaa;
    console.log(aaa);
    aaa = 111;
    fn();

    function fn(bbb){
        //变量声明提升在函数内部照样实用。
        //函数的就近原则。
        var aaa;
        console.log(aaa);
        aaa = 222;
    }

    function fn2(bbb){
        //两个函数中的局部变量不会相互影响。
        console.log(bbb);
    }

</script>

</body>
</html>

  

时间: 2024-11-05 04:50:13

11-变量声明提升和预解析的相关文章

Javascript 的变量提升与预解析

一.什么是变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分 二.怎么实现变量提升 Js 运行前有一个预编译的过程,预编译完成后,在一步步执行.那么在预编译的过程中,会执行三个动作: 1.分析参数, 2.分析变量声明, 3.分析函数声明. 具体步骤如下: 1.函数在运行的瞬间,生成一个活动对象(Active Object),简称 AO 2.分析参数 函数先接收形参,添加到

函数声明的提升和变量声明提升

注:本文转自:http://blog.csdn.net/qq673318522/article/details/50810650仅做学习方便,没有任何商业目的: 变量声明提升 1.变量定义 可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined. 2.变量作用域 变量作用域指变量起作用的范围.变量分为全局变量和局部变量.全局变量在全局都拥有定义:而局部变量只能在函数内有效. 在函数体内,同名的局部变量或者参数的优先级会高于全局变量.也就是说,如果函数内存在和全局变量同名的局

JS中的变量声明提升

JS是一种脚本语言,和一些高级语言不同,它没有完整编译的过程,一般是边写边编译,这也是我们觉得脚本语言比其他语言加载快的原因,其实,JS中有变量声明提升这一机制.当JS在执行的时候会分为2个阶段,预解析,执行,当JS在执行的时候会将所有用var声明的变量以及关键字定义的函数进行提升(  function  fn(){......}  ),提升到当前作用域的最顶端,而赋值语句在原地等待执行,预解析后,再从上往下逐行解析代码.预解析遵循一些原则,下面一点一点的说明. 提到变量声明提升,就得结合作用域

JavaScript 变量声明提升

JavaScript 变量声明提升 一.变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动 二.在基本的语句(或者说代码块)中(比如:if语句.for语句.while语句.switch语句.for...in语句等),不存在变量声明提升 三.函数声明会提升,但是函数表达式的函数体就不会提升 1 fun(); // hello 2 function fun(){ 3 console.log("hello"); 4 } 5 // -------------- 6 //

深入理解变量声明提升和函数声明提升

变量声明提升 1.变量定义 可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined. 2.变量作用域 变量作用域指变量起作用的范围.变量分为全局变量和局部变量.全局变量在全局都拥有定义:而局部变量只能在函数内有效. 在函数体内,同名的局部变量或者参数的优先级会高于全局变量.也就是说,如果函数内存在和全局变量同名的局部变量或者参数,那么全局变量将会被局部变量覆盖. 所有不使用var定义的变量都视为全局变量 3.函数作用域和声明提前 JavaScript的函数作用是指在函数内声

javascript变量声明提升

javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = "hello"; (function(){   console.log(v);   var v = "world"; })(); 这段代码运行的结果是什么呢?答案是:undefined这段代码说明了两个问题,第一,funct

js变量声明提升

1.变量提升 根据javascript的运行机制和javascript没有块级作用域这个特点,可以得出,变量会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的. 变量声明提升至全局域 console.log(a); // undefined var a ="Hi"; 相当于 var a; // 变量提升到全局作用域 console.log(a); // 已声明变量a,但未初始化,固为undefined a="Hi"; 变量声明提升至当前函数域 v

[Effective JavaScript 笔记] 第12条:理解变量声明提升

js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一些微妙的bug. functon isWinner(palyer,others){ var highest=0; for(var i=0,n=others.length;i<n;i++){ var palyer=others[i]; if(player.score>highest){ highes

js预编译环节 变量声明提升 函数声明整体提升

预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a){ console.log(a) //function a(){} var a = 123; console.log(a)//123 function a(){} console.log(a)//123 var b = function(){} console.log(b) //function()