JavaScript之作用域,作用域链和预解析

变量包括:全局变量,局部变量

在JAvaScript中,函数中定义的变量是局部变量

作用域:就是变量的使用范围,

分为:局部作用域和全局作用域

js中没有块级作用域---一对括号中定义的变量,这个变量可以在大括号外面使用

作用域链:变量的使用,从里向外,层层的搜索,搜索到了就可以直接使用了

var num=10; //作用域链 级别:0

var num2=20;

var str = "abc"

function f1() {

var num2=20;

function f2() {

var num3=30;

console.log(num);

}

f2();

}

f1();

层层搜索,搜索到0级作用域的时候,如果还是没有找到这个变量,结果就是报错

预解析:就是在浏览器解析代码之前,把变量的声明和函数的声明提前(提升)到该作用域的最上面

(1)变量的提升

下面这种情况,变量的声明被提前了,但是num的值并没有提前,结果为undefined

//变量的提升

console.log(num);

var num=100;

//提升之后为:

var num;//变量的声明提前

console.log(num);

var num=100;

(2)

函数声明被提前,代码仍然可以执行

//函数的声明被提前了

f1();

function f1() {

console.log("这个函数,执行了");

}

但是对于下面这种情况,代码报错

f2();

var f2=function () {

console.log("小杨好帅哦");

}

//声明提前后:

var f2;//为一个变量,undefind

f2();//undefind加括号是不被认可的,所以报错

var f2=function () {

console.log("小杨好帅哦");

}

要想不报错,代码可以改为:

var f2;

f2=function () {

console.log("小杨好帅哦");

};

f2();

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

时间: 2024-08-13 17:53:26

JavaScript之作用域,作用域链和预解析的相关文章

JavaScript函数之作用域 / 作用链域 / 预解析

关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ ------------------------------------------------------------------------------------------------------------------------------------------- 作用域 js中作用域只有一种,就是函

作用域和作用域链及预解析

//变量---->局部变量和全局变量, //作用域:就是变量的使用范围 //局部作用域和全局作用域 //js中没有块级作用域---一对括号中定义的变量,这个变量可以在大括号外面使用 //函数中定义的变量是局部变量 // 作用域链:变量的使用,从里向外,层层的搜索,搜索到了就可以直接使用了 // 层层搜索,搜索到0级作用域的时候,如果还是没有找到这个变量,结果就是报错 var num=10; var num=20; var str="abc"; function f1(){ var

JS变量、作用域、 内存(含 预解析面试题)

一.变量 1. 变量 命名: 变量名以$.字母.下划线开头 驼峰命名法 变量名要有意义 2. 变量 声明 声明多个变量:var message, name, age; 重复声明无效,只看第一次声明[特殊:函数内形参 与 函数内的函数名(函数声明方式创建的函数) 重名,以函数名声明为准] <script> console.log(typeof a); function a() {} var a = 10; </script> // 输出:function <script>

JS(数据类型、预解析、闭包、作用域、this)

1.数据类型的区别 基本数据类型:number.string.boolean.null.undefined 引用数据类型: 1-1:对象数据类型:Object.Array.Date.Regexp.String.Boolean等 1-2:函数数据类型function2.预解析(变量提升) 在当前作用域中.JS从上到下执行.首先把带var和function关键字的进行声明和定义 2-1:声明(declare):var num = 12; 在预解释状态为 var num = undefined; 2-

浅谈javascript中的作用域

所谓的作用域,可以简单理解为一个可以读.写的范围(区域),有些js经验的同学可能会说:"js没有块级作用域",js除了全局作用域外,只有函数可以创建作用域.作用域的一个好处就是可以隔离变量. 我们通过一些例子来帮助我们理解js中的作用域. 1 alert(a); 2 var a = 1; 如果对作用域一点不了解的同学可能会说 alert的是1或者报错:但实际上是undefined: 说到这里,我们首先说一下js逐行解析代码之前做的一些准备工作, js在逐行读代码之前,会做一些“预解析”

JavaScript之预解析

<script> /** 预解析:提前解析代码 * * 预解析做什么事? * 把变量的声明提前了(但赋值不会提前),提前到当前所在作用域的最上面 * 函数的声明也会被提前,提前到当前所在作用域的最上面 * * 预解析会分段(多对script标签中的函数重名,预解析的时候不会冲突) * * 先提前var,在提前function */ //把变量的声明提前了 console.log(num);//没有报错--undefined var num=20; f1(); function f1() { c

函数_预解析_对象

函数练习: 判断一个数是否是质数 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>这是标题</title> 6 <script> 7 function isPrime(x) { 8 for (var i = 2; i * i <= x; i++) { 9 if (x

js之预解析

一.所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义. 1)var声明的变量在预解析的时候只是提前的声明, 2)function声明的函数在预解析的时候会提前声明并且会同时定义. 二.预解析只发生在当前的作用域下 程序最开始的时候,只对window下的变量和函数进行预解析GO{}, 只有函数执行的时候才会对函数中的变量和函数进行预解析AO{}. 三.当函数执行的时候,首先会形成一个新的私有作用域

JavaScript作用域问题:预解析、全局与局部作用域解析、作用域链

要想了解JS作用域问题,就要先了解浏览器的JS解析器的工作方式,当浏览器读到script脚本代码时,JS解析器便开始工作.其工作步骤主要分为两部分: JS解析器: 1.“找一些东西”(预解析):var function 参数 例: alert(a); //undefined var a=1; alert(a); //1 function fn1(){alert(2);} JS解析器会先找到var function 参数进行预解析. 找到var定义的变量a时,解析为a = 未定义,不会读取具体值.