作用域是javascript老生常谈的问题,在面试题中也经常出现。此文记录本人对js作用域的理解。从以下三个方面深入探讨js作用域和js作用域链。

  1、什么是作用域?

  2、什么是作用域链?

  3、常见面试题。

  

  一、什么是作用域?

    熟悉编程的人都接触过作用域,比如全局变量和局部变量之分。作用域是变量和函数可以访问的范围,即作用域控制着变量和函数的可见性和生命周期。

var name = "Aralic";
function person () {
//局部变量
var age = "22"; console.log(country) // "china"
console.log(name); // 'Aralic'
console.log(age); //
} person();

在这段代码中,函数person就创建一个作用域,作用域里面定义了一个变量age,在函数person外面是无法访问这个变量的。但是在函数person内部是可以访问到变量name,

因为name是函数person外面定义的,相对函数person是全局变量。

  二、什么是作用域链?

    其实上面的例子已经出现了作用域链了。本来想画图解释的,可惜画图功底实在太差了。还是上代码吧。

var country = "china";
function china () {
var name = "Aralic";
function person () {
//局部变量
var age = "22"; console.log(country) // "china"
console.log(name); // 'Aralic'
console.log(age); //
} person();
} china ();

在函数person中,访问country的过程:先从函数内部找,发现没有country这个变量,那玩外层函数china找,结果还是没有找到,那继续往外找,结果找到了,不容易啊,嘿嘿,那这就是作用域链,一环扣一环,很厉害,有木有!

扩展:看到这里,有小伙伴就要问了,假如在函数person里面也定义一个变量country=“American”,那结果会是怎么样?会不会变量冲突?

大声告诉你,不会冲突,结果就是直接打印出来American。不会向外层查找了。这样就形成了一条完整的作用域链,如果找到浏览器顶层window还没有访问到目标变量和函数,

那直接返回脚本错误!

性能相关小技巧: 如果函数嵌套比较深,那么我们在最里面函数中用原生方法比如,document.getElementById(id); 那么这个document我们是不是需要一层一层向外查找,

那考虑到性能问题,我们是不是可以直接在函数里面把document赋值给一个变量,那每次只要访问这个变量就终止查找了!

     三、常见面试题:

  我们已经学习了作用域和作用域链的知识,那么下面来看几个面试题。

第一题:

var  name = "Aralic";

function person () {
console.log(name);
var name = "Aralic";
  
} person();

博主第一次见到这个题目的时候,以为答案是Aralic,有没有人和我想的一样的?

在函数执行前,javascript存在预编译过程。

当调用函数person的时候会先预编译,把变量和函数声明提升,转成

function person () {

  var name; //不赋初始值

  console.log(name);// 输入undefined

  var name = "Aralic";

  console.log(name) // 输出Aralic

}

person ();

第二题:

  var name = 'Aralic';
function person() {
console.log(name);
} function test() {
var name = 'tom';
person();
} test();

这个题目看起来有点绕,先执行test函数,然后在test函数里面调用person函数,执行person函数,打印name变量,那到底name变量是从test函数里面找,还是直接访问最外面的name全局变量。这个题目和作用域链有关,说起来,person和test函数地位是相同的,所以是直接从最外面找name。

更多相关问题:请阅读《单页web应用》第二章节,讲的比较详细。

JavaScript作用域(链)学习笔记的更多相关文章

  1. javascript作用域链学习笔记

    作用域链 "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里." --权威指南 在JavaScript中,一切皆对象,包括函数.函数对象和其它对象 ...

  2. JavaScript原型(链)学习笔记

    javascript是基于原型的一门脚本语言,那究竟原型是什么? 本文将从以下几个方面重点阐述原型 构造函数是什么? 构造函数和我们常见的Array String有什么关系? 原型的使用? __pro ...

  3. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  4. GNU工具链学习笔记

    GNU工具链学习笔记 1..so为动态链接库,.a为静态连接库.他们在Linux下按照ELF格式存储.ELF有四种文件类型.可重定位文件(Relocatable file,*.o,*.a),包含代码和 ...

  5. ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录

    放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...

  6. JavaScript作用域链的理解

    前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理.这篇文章对JavaScript作用域链和作用域链做一个简单的介 ...

  7. JavaScript 作用域链图具体解释

    <script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...

  8. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  9. Javascript高级编程学习笔记(10)—— 作用域、作用域链

    昨天介绍了,JS中函数的作用域 什么词法环境之类的,可能很多小伙伴不太明白. 在今天的内容开始之前,先做个简短的声明: 词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let.const声 ...

随机推荐

  1. JQuery 弹出层,始终显示在屏幕正中间

    1.让层始终显示在屏幕正中间: 样式代码: .model{ position: absolute; z-index: 1003; width:320px; height:320px; text-ali ...

  2. Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

    3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 ...

  3. Jquery 右键菜单(ContextMenu)插件使用记录

    目前做的项目需要在页面里面用右键菜单,在网上找到两种jquery的右键菜单插件,但是都有各种问题.所以就自己动手把两种插件结合了下. 修改后的右键菜单插架可以根据绑定的触发页面元素不同,复用同一个菜单 ...

  4. 关于View端

    View--------------Request 1 URL vs n View 同一个URL可以对应多个View, HTML(通过Request请求获得) 例如SAO项目中的step1--> ...

  5. 【JavsScript】XMLHttpRequest Level 2 使用指南

    XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信. 最早,微软在IE 5引进了这个接口.因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生. ...

  6. spring mvc 3.0 ModelAndView模型视图类

    见名知意,从名字上我们可以知道ModelAndView中的Model代表模型,View代表视图.即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性.我们看一下Mod ...

  7. 三星Galaxy S4(GT-I9500)获取ROOT权限教程(转)

    http://news.candou.com/2013-05-20/453695_1.shtml 获取root权限的方法

  8. Perl 引用与匿名数组

    写这篇是因为工作遇到一个需要使用列表作为hash的值的问题,这在Python中是非常简单而轻松的事,如下面这段python程序. def add_to_index(index, keyword, ur ...

  9. MySQL · 引擎特性 · InnoDB 事务锁简介

    https://yq.aliyun.com/articles/4270# zhaiwx_yinfeng 2016-02-02 19:00:43 浏览2194 评论0 mysql innodb lock ...

  10. 数据连接命令join

    join主要用来将两个相关联的文件连接起来.两个文件相关联的意思是指这两个文件中有一些字段是关联的,例如两个文件的第1个字段都是学号,且每个学生的学号是唯一的.像这种具有唯一性关联的文件,就可以使用j ...