作用域和预解析

// 作用域:

// 域:空间、范围、区域……

// 作用:读、写

script 全局变量、全局函数

自上而下

函数

由里到外

{}

浏览器:

“JS解析器”

1)“找一些东西” :var function 参数

a = ...

所有的变量,在正式运行代码之前,都提前赋了一个值:未定义

fn1 = function fn1(){ alert(2); }

所有的函数,在正式运行代码之前,都是整个函数块

JS 的预解析

遇到重名的:只留一个

变量和函数重名了,就只留下函数

2)逐行解读代码:

表达式:= + - * / % ++ -- ! 参数……

表达式可以修改预解析的值!

alert(a); // function a (){ alert(4); }

var a = 1;

alert(a); // 1

function a (){ alert(2); }

alert(a); // 1

var a = 3;

alert(a); // 3

function a (){ alert(4); }

alert(a); // 3

alert( typeof a );

// a(); // 报错

*/

/*

var a = 1;

function fn1(){

alert(a); // undefined

var a = 2;

}

fn1();

alert(a); // 1

var a = 1;

function fn1(){

alert(a); // 1

a = 2; 局部可以改变外部,第二个a变成了2

}

fn1();

alert(a); // 2

*/

/*

var a = 1;

function fn1(a){

alert(a); // undefined

a = 2;

}

fn1();

alert(a); // 1

var a = 1;

function fn1(a){

alert(a); // 1

a = 2;

}

fn1(a);

alert(a); // 1

一、作用域份为全局作用域和局部作用域作用域不仅有有变量作用域还有函数作用域

var a = 10

// a是全局作用域 在哪里都能访问和修改

function fn() {

var b = 8 //这是局部作用域也成为函数作用域

console.log(a) //10 a是全局作用域

}

console.log(b) //这里b是不存在的 会报

function fn() {

var a = 10;

console.log(a)

function say() {

var b = 2

console.log(b) //2

console.log(a) //10 可以访问到

}

say() //可以调用

}

fn()

console.log(a) //报错

say() //报错

//预解析

//预解析 热身运动

console.log(b) //undefined

var b = 10

console.log(c) //报错

c = 10

// js执行时 步骤

// 1、预解析

// 找东西 (var 函数 参数) 步骤:

// 1.var :找到var 给var 的变量赋一个undefined 提到最前面

// 2.函数: 找到函数整体提到最前面

// 3.参数:同var

//例如:

// console.log(b) //undefined

// var b = 10

// 找东西

var a = undefined;

console.log(a) //所以 是undefined

var a = 10

// 小案例:

var a = 10;

function fn() {

console.log(a) //undefined

var a = 5;

}

fn()

console.log(a) //10

//首先预解析

// 找var提到最前面

// var a = undefined

// 函数是一个作用域也要提到前面 进行预解析

// 函数中的预解析

// function fn() {

// 找var a = undefined;

// console.log(a) //undefined 它是先看自己域中有没有这个值没有在往外找

// 赋值 a = 5

// }

//赋值 a = 10

// fn()

// console.log(a) //10

完事 逐行解读

思考:

// 小案例:

var a = 10;

function fn() {

console.log(a) //10

a = 5;

}

fn()

console.log(a) //5

参数同var

//预解析

var a = undefined;

function fn(a) {

// 参数同var相当于

a = undefined

console.log(a) //undefined

a = 2 //局部变量赋值

}

a = 10 //全局变量赋值

fn()//注意这里是没有实参的

console.log(a) //10

有实参

//有实参

var a = 10;

function fn(a) {

console.log(a) //10

a = 2

}

fn(a) //有实参

console.log(a) //10

// 预解析

var a = undefined

function fn(a) {

// 形参是实参传过来的 相当于这里有

var a = 10; //局部变量

console.log(a) //10

a = 5 //给局部变量赋值

}

a = 10 //这里是全局变量

fn(a)

console.log(a) //10

// 预解析如果同名

// 函数 > 参数和var

function fn(a) {

var a = undefined //被覆盖var a = function a() {}

console.log(a) //是个函数 function a() {}

var a = 5; 他也干不过 变成了a = 5

function a() {} //函数大于参数和var 直接覆盖

console.log(a) //5

}

fn(1)

解决为什么函数表达式只能在定义后面调用

fn() //报错

var fn = function() {} //因为他提上去 var fn =undefined

fn() //正常执行

原文地址:https://www.cnblogs.com/tongguilin/p/12229496.html

时间: 2024-10-10 21:35:18

作用域和预解析的相关文章

关于作用域和预解析的不常见重要知识

作用域和预解析 在javascript中作用域是非常重要的,本文章将会说明作用域,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内  1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量名,注意:变量体不会随着提升,加载va

小白学js第六天之代码规范,作用域以及预解析

目录 代码规范 命名规范 变量规范 注释规范 空格规范 换行规范 作用域 全局变量 局部变量 块级作用域 作用域链 预解析 什么是预解析 变量提升 此篇木有脑图,嘻嘻 代码规范 命名规范 变量.函数的命名必须要有意义 变量一般用名词 函数一般用动词 变量规范 操作符前后要有空格 var name = 'zs'; 注释规范 // 这里是注释 空格规范 if (true) { } for(var i = 0; i < n; i++ ) { } 换行规范 var arr = [1, 2, 3, 4];

JavaScript中作用域和预解析

作用域以及预解析 在javascript中作用域是非常重要的,本文章将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内 1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量

JS作用域概念-预解析规则

// 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代码: 表达式

javascript里面的闭包,作用域,预解析

函数的作用域 1.全局变量=公用卫生间 2.局部变量=次卧卫生间      局部变量 全局无法使用      局部声明变量不加var的话就变成全局变量(不推荐使用) 3.闭包=次卧的可以用自己的卫生间,也可以用公用卫生间: 预解析 1.先把变量声明 全部提前,赋值不动 2.函数也有预解析,直接提前   3.预解析 不会脱离函数作用域,也不会冲出script标签 最多提到自己标签的顶部 代码执行顺序 见一个srcipt解析执行一个,执行完了 在执行下一个 案例1:      alert(a);  

JavaScript有关作用域和预解析

作用域:使用范围 全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用 除了函数以外,其他的任何位置定义的变量都是全局变量 局部变量:在函数内部定义的变量,是局部变量,外面不能使用 全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存 全局作用域:全局变量的使用范围 局部作用域:局部变量的使用范围 块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;

JS的作用域和预解析

当我们使用Js 来编写一个函数的时候,总是会分不清,自己所声明的变量到底是全局变量,还是局部变量,这就牵扯到了作用域的问题.以及在函数执行的时候,函数内部的变量与全局变量及输出结果,在不同状况下的关系问题.下面就让我来举例说明一下. 作用域: 指的是代码对不同的“范围”的划分. 划分规则: 1 全局是一个作用域 这个作用域叫做全局作用域 2 只有函数,可以划分这么一个“范围”(作用域) 这样划分出来的作用域叫做私有作用域. 划分规则的应用对象: 变量 所以我们可以理解为: 作用域 划分了一个所有

作用域,预解析,对象,内置方法 Math Date Array

作用域 一段程序代码中所用到的名字并不总是有效可用的,而限定这个名字(变量)的可用性的代码范围,就是这个名字的作用域,作用域提高了逻辑程序的局部性,增强了可靠性,减少了名字冲突: JavaScript作用域(es6)之前:全局作用域,局部作用域 全局作用域:整个script标签或者是一个单独的JS文件 局部作用域(函数作用域):在函数内部就是作用域: 变量作用域 全局变量:在全局作用域下声明的变量:如果在函数内部没有声明(var)直接赋值的变量也是全局变量 num = 2; 局部变量:在函数内部

javascript预解析和作用域

JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在编译阶段JavaScript解析器借助执行环境把字节码生成机械码,并顺序执行; 预解析:在当前的作用域中,js代码执行之前浏览器会默认把所有带var 和function的进行提前的声明或者定义; eg:var num=1; sum(); function sum(){console.log(num)