了解JavaScript的同学可能知道,JavaScript语言由于设计原因,导致语言本身存在很多先天性的不足,当然这并非设计者有意的,js语言最初是被设计来作为网页交互的脚本语言,依照现有的js语法来看,其最初的需求已经完全能够满足。互联网的发展极大的提高了对web端的要求,不仅仅要求简单的页面交互,已经趋于app的概念,这才暴漏出JavaScript语言设计上的种种问题。对于开发者来说,理清“坑点”并在实际开发中正确的规避才是重点。

1、任何js代码都有自己的作用域

  ES6之前,使用var声明变量的时候,很容易被忽略的一点是,var声明的变量的作用域;

  1)在函数中var声明的变量,其作用域是在函数体内部,即函数外部是访问不到的:

<script>
function foo() {
var myname = "foo_name";
console.log(myname);//foo_name
}
foo();
console.log(myname);//error
</script>

  这是很容易理解的,因为JavaScript本身有函数作用域。

  2)不在函数中var声明的变量:

<script>
var myname_1 = "myname_1";
{
var myname_2 = "myname_2";
}
console.log(myname_1);//myname_1
console.log(myname_2);//myname_2,不会error
</script>

  这也很容易理解,因为JavaScript中没有块级作用域,在{}中声明的变量和不使用{}没有区别。

  3)这里很容易很忽略的一点是,以上js代码都有作用域,就是全局作用域window,所有声明的变量都有自己的作用域,只不过常见的是作用域是全局作用域即window,很容易被忽略掉,导致没有作用域的认知。有时候这点误区会导致验证的错误。

  新建html页面html1.html,首先看看如何验证以上的说法,

<script>
function showName () {
console.log("这里是showName");
}
window.showName();//这里可以验证shownName的作用域在window
</script>

  以上代码很容易验证了showName函数的作用域是window。

  新建页面html2.html,并写入一下js:

<script>
function showNameToo () {
console.log("这里是showNameToo");
}
window.showNameToo();
</script>

  现在在html1页面中使用iframe引用html2页面,在html1中添加js代码:

<script>
function showName () {
console.log("这里是showName");
}
window.showName();
var iframe = document.querySelector("#iframe");
iframe.src = "html2.html";
window.iframe.contentWindow.showNameToo();
</script>

  在html2.html中添加如下代码:

<script>
function showNameToo () {
console.log("这里是showNameToo");
}
window.showNameToo();
window.parent.showName();
</script>

  在页面上打html1(通过服务器打开,不能直接打开文件),可以看到有趣的现象。

  总结:之所以讲这个例子,是因为不少新加入前端的同学都会有一个误区,就是js中只有函数作用域(忽略全局作用域,因为使用的很少)。其实这个观点很重要,在多模块开发中,一个模块就相当于一个页面的windiw作用域。

JavaScript 作用域的误区的更多相关文章

  1. JavaScript作用域

    JavaScript作用域 JavaScript作用域一直是前端开发的难题,现在只要用五句话就可解决. 一.“JavaScript中无块级作用域” 在Java或C#中存在块级作用域,即:大括号也是一个 ...

  2. 关于Javascript作用域及作用域链的总结

    本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/200 ...

  3. JavaScript作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

  4. [译] 你该知道的javascript作用域 (javascript scope)(转)

    javascript有一些对于初学者甚至是有经验的开发者都难以理解的概念. 这个部分是针对那些听到 : 作用域, 闭包, this, 命名空间, 函数作用域, 函数作用域, 全局作用域, 变量作用域( ...

  5. Python自动化 【第十六篇】:JavaScript作用域和Dom收尾

    本节内容: javascript作用域 DOM收尾 JavaScript作用域 JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走 ...

  6. 深入理解javascript作用域系列第一篇——内部原理

    × 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域 ...

  7. 深入理解javascript作用域系列第二篇——词法作用域和动态作用域

    × 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...

  8. 深入理解javascript作用域系列第四篇——块作用域

    × 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...

  9. 深入理解javascript作用域系列第三篇——声明提升(hoisting)

    × 目录 [1]变量 [2]函数 [3]优先 前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javasc ...

随机推荐

  1. Confluence 6 选择一个默认的语言

    管理员可以设置应用到你 Confluence 站点所有空间的默认语言.请注意,一个独立的用户可以在他们自己的属性中选择他们独立的语言属性. 设定默认的语言 在 Confluence 站点中修改默认的语 ...

  2. 【深度学习】吴恩达网易公开课练习(class1 week3)

    知识点梳理 python工具使用: sklearn: 数据挖掘,数据分析工具,内置logistic回归 matplotlib: 做图工具,可绘制等高线等 绘制散点图: plt.scatter(X[0, ...

  3. MYSQL安装报错 -- 出现Failed to find valid data directory.

    运行环境:windows10数据库版本:mysql.8.0.12安装方式:rpm包直接安装 问题描述:mysql初始化的时候找不到对应的数据库存储目录 报错代码: 2018-10-13T03:29:2 ...

  4. poj1236 SCC+缩点

    /* 强连通分量内的点可以互相传送,可以直接缩点 缩点后得到一棵树 第一问的答案是零入度点数量, 第二问: 加多少边后变成强连通图 树上入度为0的点有p个,出度为0的点为q,那么答案就是max(p,q ...

  5. PyCharm新建.py文件时自动带出指定内容

    如:给Pycharm加上头行  # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...

  6. .tar.xz文件的解压方法

    废话不多说: 直接看 方法一: tar -xvJf ***.tar.gz 方法二: 先减压成 .tar 格式的文件, 再解压 .tar #xz是一个工具, 系统中没有安装,需要下载 xz -d *** ...

  7. windows_agent 添加

    一:复制windows agent文件和.exe文件到c:\zabbix\目录下 二:配置zabbix_agentd.win.conf文件 hostname:设置为自定义名称,但是要和zabbix-s ...

  8. mysql 简称

    一:DTS(Data Transformation Service) 数据转换服务 大多数组织都使用多种格式和多个位置来存储数据. 为了支持决策.改善系统性能或对现有系统进行升级,经常必须将数据从一个 ...

  9. 解决response.setHeader("Content-disposition" 中文乱码问题

    Content-Disposition中文乱码 Response.setHeader(”Content-Disposition”, “attachment; filename=” + fileName ...

  10. 小甲鱼python基础教程飞机大战源码及素材

    百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取. 下载