细说JavaScript中的作用域与变量

本篇文章讲述了JavaScript中的作用域与变量,大家对JavaScript中的作用域与变量不了解的话或者对JavaScript中的作用域与变量感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧

变量作用域

作用域:就是变量声明的区域,也是变量和函数的可访问范围。在全局声明的变量为全局可见可访问的就是全局变量,如果在函数内部声明的变量只能在函数内部可访问,可称为局部变量。

几个注意点:

1.JavaScript中没有块级作用域(在ES5和ES6之前),只有JavaScript和全局作用域。for循环内部定义的变量是函数级别的作用域。

2.变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域。特殊:var a = b = c = 0;  b与c是全局变量。

立即学习“Java免费学习笔记(深入)”;

3.JavaScript是以它声明时为准的,因为变量的作用域在js代码的解析阶段就已经完成规则的制定。

简单案例:

//变量的作用域var t = 90;  //全局作用域,在js代码中任何一个地方都可以访问function f1(){  //f1函数 在全局作用域中var t2 = 10;  //t2是f1函数内部变量,只有在f1内可访问console.log(t2);function f2(){ //f2函数  在f1函数的作用域中var t3 = 20;//只能在f2函数内部才能访问console.log(t3);return t2*t3;  // 访问了父级作用域中的t3}return f2();}var m = f1();console.log(m);

登录后复制

2.没有块级作用域

前面我说到JavaScript中没有块级作用域,这是对于es5 es6之前来说9(let const等)。for循环,JavaScript中定义的变量的作用域是函数级别的作用域。

例如:

//没有块级作用域function f1(){for(var i=0;i


3.变量提升 (hositing)

js引擎在执行js代码的时候,首先会先创建全局的EC(上下文)和函数的EC(如果有函数),在创建EC的时候已经把当前作

用域里面声明的变量初始化为undefined,怎么初始化呢?js引擎首先会在当前作用域去找var这个变量定义,发现有这个定义,那么就

把它提升到作用域的最前面,并且保存在内存中(即EC中的变量对象VO),设为undefined。

案例:

var a = 10;function f1(){//在这里首先会创建f1的执行上下文  并把里面的变量初始化为undefinedconsole.log(a);  //代码执行到这里的时候, js引擎会去当前作用域内存中问有没有这个变量的声明,发现有,那么就给他初始的undefined//假如说下面没有var变量进行定义a,那么js就会向父级作用域中去找这个变量,直到找到为止var a = 19;  //在这里给a赋值了19console.log(a); // 打印了19}f1();console.log(a);  //这里无疑是10 没什么问题

登录后复制

所以,js引擎在创建上下文的时候,就会对有需要的变量进行变量提升,可以说是一种安全保护机制,ES6中对其进行了详细讨论。

注意:当变量声明和函数声明 为同一个名字的时候,函数的优先级高。

console.log(b); //打印b(){}var b = 9;function b(){}console.log(b); //打印9

登录后复制

由于函数被提升到最前面,那么一开始打印的无疑是b(){} ,因为js是动态语言,把b重新赋值为9,覆盖掉之前的function。

案例一:

if ("a" in window) {var a = 1;}console.log(a);

登录后复制

首先看到你段代码,你的答案是什么?会不会是Uncaught ReferenceError: a is not defined?

告诉你,答案是1

首先,你要清楚var a = 1其实是定义了一个全局变量(属于JavaScript下的属性),因为if并不是块作用域,JavaScript中es5之前没有块作用域。所以这个JavaScript是成立的。

再来看:

if (!("a" in window)) {var a = 1;}console.log(a);

登录后复制

那么这个应该是什么呢?答案是undefined,因为条件不成立,没有给a赋值成功,默认为undefined 

案例二:

fun();console.log(a);console.log(b);console.log(c);function fun(){var a = b = c = 10;console.log("fun中的a="+a);console.log("fun中的b="+b);console.log("fun中的c="+c);}

登录后复制

你得答案是什么?

答案是:

细说JavaScript中的作用域与变量

由于a没有定义,所以直接报错,下面的两行代码被阻止执行了,假如把外面的console.log(a)注释掉呢?

fun();//console.log(a);console.log(b);console.log(c);function fun(){var a = b = c = 10;console.log("fun中的a="+a);console.log("fun中的b="+b);console.log("fun中的c="+c);}

登录后复制

输出的是:

细说JavaScript中的作用域与变量

为什么外面b c都会是10呢? 原因就是var a = b = c = 10 ;其中b c就是全局变量,如果你想定义三个内部变量,那么应该这样定义:

var a = 10 ,b = 10, c = 10;

弄懂了以上这些区别,基本上变量提升就没什么大问题了。以上就是本篇文章的所有内容,大家要是还不太了解的话,可以自己多实现两边就很容易掌握了哦!

相关推荐:

JavaScript

JavaScript

以上就是细说JavaScript中的作用域与变量的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2782890.html

(0)
上一篇 2025年3月8日 16:40:14
下一篇 2025年3月7日 13:07:13

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 好用的js插件分享

    从一些开源网站上下载下来的 后台管理系统模板一般会有很多的js ,其js 的功能是什么呢?这里随手查询了一下,记录下来,希望本文能帮助到大家。 正文: 1.zDialog.js 各种弹窗插件 详细案例:http://www.2ky.cn/P…

    2025年3月8日 编程技术
    200
  • vue-cli初始化一个vue.js项目的方法实例

    解析打包.vue文件 vue为了能够使我们在项目开发中对组件进行更好的维护,提供了一个单文件组件系统,vue把每一个独立的组件放在一个.vue的文件中,在这个文件中提供基础三个自定义标签:1. template2. script3. sty…

    编程技术 2025年3月8日
    200
  • javascript实现线程以及事件循环详解

     本篇文章讲述了javascript实现线程以及事件循环,大家对javascript实现线程以及事件循环不了解的话或者对javascript实现线程以及事件循环感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧 1.为什么说…

    2025年3月8日
    200
  • vuejs实现插件状态管理详解

    本篇文章讲述了vuejs实现插件状态管理,大家对vuejs实现插件状态管理不了解的话或者对vuejs实现插件状态管理感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧 对于新手来说,一开始接触vuex时候只听说它很强大,很好…

    2025年3月8日
    200
  • JavaScript实现事件委托方法详解

    本篇文章讲述了JavaScript实现事件委托方法,大家对JavaScript实现事件委托方法不了解的话或者对JavaScript实现事件委托方法感兴趣的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧 基本概念 事件委托,通俗地…

    2025年3月8日
    200
  • js无缝滚动的实例分享

    本文主要和大家分享js无缝滚动的实例,希望能帮助到大家。效果原理:让ul一直向左滚动 复制li,改变ul的宽度, 进行判断,是否越界 如果越界,重新定位。 控制向左向右,设定一个speed,更改其值的正负。 nbsp;html>   …

    编程技术 2025年3月8日
    200
  • js中DOM知识点分享

    1、childNodes和nodeType  childnodes获取子节点,但是会把中一个标签与另一个标签的空格当做文本节点来计算。nodetype判断一个节点是什么类型的节点。只有当nodetype==1时才是元素节点,2是属性节点,3…

    编程技术 2025年3月8日
    200
  • js中导航栏背景改变实例

    本文主要和大家分享js中导航栏背景改变实例,希望能帮助到大家。 使用到this关键字 nbsp;html>                    导航栏改变背景         *{margin: 0;padding: 0;} #p1…

    编程技术 2025年3月8日
    200
  • js数组以及sort方法详解

    本文主要和大家分享js数组以及sort方法详解,js中的数组的length,既可以获取又可以设置,本来长度是6,设置成3时,此时数组里的值只有前三个,所以可以用来清空数组 。 push(4),往数组尾部添加一个4,pop()是在尾部删除一个…

    编程技术 2025年3月8日
    200
  • js面向对象实例讲解

    关于js面向对象的知识我们已经和大家分享过很多,本文主要和大家分享js面向对象实例讲解,希望能帮助到大家。 nbsp;html>function people(name,age){this.name = name;this.age =…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论