第06课:作用域、JS预解析机制】的更多相关文章

JS的预解析过程: 1,预解析 2,再逐行解读代码, 实例: ---------------------------- <script>        var name="xm";        var age=18;        function fn(argument){            console.log(name);            var name="xh";            var age=12;        }&l…
从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undefined var a = 1; alert(a); //为什么浏览器无反应 a = 1; 要了解为什么这些现象必须先知道浏览器是如何读取js代码,而这段浏览器专门用来读取js代码的片段我们称之为-----js解析器  首先,我们来理解“JS解析器”是如何工作的? 先看如下代码 alert(a); /…
知识点总结 浏览器的解析方法 script 全局变量,全局函数 自上而下 函数 由里到外 "JS的解析器": 1)“找一些东西”:var function 参数 var a=未定义 =>所有的变量,在预解析时,赋一个值:未定义 fn1 = function fn1(){alert(2)} =>所有的函数,在预解析时,是整个函数块 function fn1(n1) {} =>这里的参数n1,相当于var n1 ,因此也是未定义 在预解析时,遇到重名的:只留一个,var和…
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> /* // 作用域: // 域:空间.范围.区域-- // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到…
文章目錄 解析机制 JavaScript是一门解释型的语言 , 想要运行js代码需要两个阶段 编译阶段: 编译阶段就是我们常说的JavaScript预解析(预处理)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码 执行阶段: 在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并从上到下按顺序执行 预解析时做什么 var , function声明的变量提升 首先,创建一个当前执行环境下的活动对象,然后将用 var 声明的变量设置为活动对象…
JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就存在解析,那它是怎么运行的呢.首先呢,然后分成两大步骤. 1 第一步叫做JS预解析,这一步骤实际上是一种准备工作把,在执行之前,它会先浏览整个代码,然后寻找三种东西. 1var  2 函数声明    我来分别解释一下.首先它会提取带var声明的变量,然后放到作用域中,但是不会提取变量的值,会先给他赋…
变量:  存储数据的容器     1.声明        var   2.作用域       全局变量. 局部变量. 闭包(相对的全局变量):   3.类型         a.基本类型(undefined, null, boolean, number, string)   b.引用类型:(object, function),其实function 也是对象-->var a = new Function(alert('我也是对象'));   4. 类型转换    隐式转换(==, -, *, /,…
一.函数 每个函数都是 Function类型的实例,也具有属性和方法.由于函数也是一个对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 1.函数的定义方式 (1).函数声明 function add(a, b) { return a + b; } 函数声明提升:在执行代码之前,会先读取函数声明,也就是说,可以把函数声明放在调用它的代码之后 fn(); function fn() {console.log(1)}   (2).函数表达式 var add = function(a…
hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就…
js预解析的题像在做智力题一样有意思~ 预解析 预解析:在解释这行代码之前发生的事情——变量的声明提前了,函数的声明提前 console.log(num) ——未定义Num,结果是报错 var num; console.log(num)——结果是undefined console.log(num) var num = 10;——结果是undefined 注意:预解析分段,多对的script标签中如果函数名相同,互不影响 预解析就是变量的声明提前了,比如 console.log(num);var…
首先我们来看一段代码: <script> console.log(a); var a = 10; </script> 此时运行结果为   为什么会显示undefined呢?这就涉及到了预解析中的变量提升: 1.局部提升(变量)  会把变量声明分成两部分       1) 变量声明  只有这个部分发生了提升,提升至所在作用域的最前面       2) 变量赋值  在原位置: 接下来再看一段代码: <script> foo(); function foo(){ consol…
var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function xx(){return 5;} } 不会出错,而 { var k = xx(); var xx = function(){return 5;} } 则会出错. 为什么会这样呢?这就要引出javascript中的预解析机制来解释了. JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个…
// 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代码: 表达式…
js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等号后面的a = 1,所以a的值是未定义,并加入仓库,根据function找到函数后,function a (){ alert(2); },找到函数是函数整体,这是js的预解析(预解析只找var 和函数).遇到重名的留下后面的,变量和函数重名了,函数在后面,只留下函数. 正式读取代码的时候,是从上到下…
目录 1:函数的其他定义 2:函数作为参数 3:函数作为返回值 4:作用域 5:作用域链 6:预解析 7:预解析分段 复习 <script> /* * 复习: * 函数:把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了 * * 函数作用:代码重用 * * 函数的参数: * 1.形参:函数定义的时候,函数名字后面的小括号里的变量 * 2.实参:函数调用的时候,函数名字后面的小括号里的变量或者值 * * 返回值: * 函数中有return,函数有返回值 * 函数中没有re…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.函数练习 1.求最值 // - 求2个数中的最大值 function getMax(num1, num2) { return num1 > num2 ? num1 : num2; } console.log(getMax(10,20)); //console.log(getMax);//函数的代码 function getMax(num1, num2) { return num1 > num2…
函数: 把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了 函数作用: 代码重用 函数的参数: 形参:函数定义的时候,函数名字后面的小括号里的变量 实参:函数调用的时候,函数名字后面的小括号里的变量或者值   返回值: 函数中有return,函数有返回值 函数中没有return,函数没有返回值   没有明确返回值:函数中没有return或者return后面没有任何内容 如果一个函数没有明确的返回值,接收这个函数,结果是undefined   无参数无返回值的函数 无参数有…
JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lilei"; 对于函数声明, 可以看下下面这块代码 sayHello(); // "Hello" function sayHello() { console.log("Hello"); } 由上面的执行结果, 我们可以知道JS的预解析对变量和函数的行为是不一样的,…
预解析: // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是赋整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代…
前言 JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢? 事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有“预解析”行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正. 在ES6之前,变量使用var声明,会存在变…
js在执行之前会进行预解析. 什么叫预解析? 预:提前 解析:编译 预解析通俗的说:js在执行代码之前会读取js代码,会将变量声明提前. 变量声明包含什么?1.var 声明 2.函数的显示声明. 提前:是会将这些变量声明提前声明读取,避免在执行代码的过程中出现未定义的问题. 注意: 只是提升变量,并不是提升变量赋值. 对于es6中的let不具体 变量提升. 例子: <script> test(); function test() { console.log() } </script>…
1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数 js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个[未定义]的值.而js解析器提取函数是整块提取的读出来,把函数当作整体来看待,也就是说读变量是没值的,读函数是有内容的.这个过程就是js的预解析 所以在逐行读代码的这一步时,解析器每找到一个var声明,就会去看先前提取的东西中有没有它的值(往往是[未定义]) 2.var a=0; var是声明, a=0是表达式 如…
//示例 1 alert(a) // undefind. alert(fn) // function 整个函数块. var a = 1; function fn(){ return falss; }; 为什么?第一个是 undefind , 第二个是 functin 函数块.这是怎么运行的? js解析器在运行js代码的时候 分为两步: 第一步 把所有的 变量.函数.参数 提前到当前作用域的顶部. 第二步 逐行解读代码 从左到右.从上至下. //示例 1 解释 var a; // a 变量 提前到…
1.1 知识点 函数:就是可以重复执行的代码块 2.  组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖,后面的覆盖前面的 函数名等于整个函数,打印函数名,就等于打印整个函数的代码 7.  加载函数的时候只加载函数名,不加载函数体 参数相当于局部变量 两个平级的函数中变量不会相互影响 10.     预解析:函数在解释文档的时候会被整体提到文档的最前面,和加载不一样 第一种:解析的时候会被提前,可在任…
1.作用域     一般情况下,一段代码中所用到的名字并不总是有效可用的,     而限定这个名字(变量)的可用性的代码范围就是这个名字的作用域,可用有效的减少变量名冲突     2.js的作用域(es6)之前:全局作用域,局部作用域     3.全局作用域:整个script标签 或者是单独的JS文件     4.局部作用域(函数作用域),在函数内部就是局部作用域,这个变量名只能在函数内部使用     5.变量作用域     根据作用域的不同,变量分为全局变量,局部变量 注意     如果在函数…
函数的作用域 1.全局变量=公用卫生间 2.局部变量=次卧卫生间      局部变量 全局无法使用      局部声明变量不加var的话就变成全局变量(不推荐使用) 3.闭包=次卧的可以用自己的卫生间,也可以用公用卫生间: 预解析 1.先把变量声明 全部提前,赋值不动   2.函数也有预解析,直接提前   3.预解析 不会脱离函数作用域,也不会冲出script标签 最多提到自己标签的顶部 代码执行顺序 见一个srcipt解析执行一个,执行完了 在执行下一个 案例1:      alert(a);…
一.函数定义 1.方式一       function 函数名(参数){  函数体  }——————函数声明的方法 function fn(a){ console.log(a); }: 2.方式二      var  变量名  =  function(参数){  函数体  }——————函数表达式 var fn=function(a){ console.log(a); }: 3.注意的问题: 函数必须先定义,再调用 //先声明 function fn(a){ console.log(a); }…
预解析 JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的.JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程 预解析过程: 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用. 先提升var,在提升function. JavaScript的执行过程 // 案例1 var a = 25; function abc() { alert(a)…
<script> // f1(); // console.log(c);//9 // console.log(b);//9 // console.log(a);//报错 // function f1() { // var a = b = c = 9; // console.log(a);//9 // console.log(b);//9 // console.log(c);//9 // } //调用时f1函数提前 //var a = b = c = 9;相当于 // var a=9;//局部变…
1.排查语法错误 <script> console.log(1; </script> 2.变量提升和函数整体提升 <script> console.log(n1); </script> <script> console.log(n1); var n1 = 1; </script> 3.变量提升只提升变量名不提升变量的值…