现在校招也基本结束了,所以有时间把这段时间遇到的问题做个总结.在很多的笔试题目中,发现有很多对JS作用域方面的考察,所以查阅资料总结一下.

众所周知,js不像其他OOP语言那样,他是一种弱类型的语言,对数据类型没有很明显的区别.还有一点不同是它的作用域,引起这点不同主要是因为js的继承方式是通过原型链的方式来实现的.

a)js没有块级作用域,所谓块级作用域即if,for,while(花括号括起来的部分)语句里面的部分.测试如下(Chrome浏览器).

下面为输出结果

从结果可以看出,js不存在块级作用域,一样可以输出str1.

b)js里面只有函数作用域,以及全局作用域,下面分析函数作用域.

下面为输出结果

从结果可以看出js存在函数作用域,所以在fun1以外str2未定义.要想搞明白js的作用域就要牵扯到原型链的问题,下面对其简单分析.

c)当在当前作用域找不到指定对象或变量时,js会通过原型链向上寻找,即查找当前作用域的父级作用域,如若仍未找到,仍会向上寻找,直到找到,或找到根节点未找到为止.

下面为输出结果:

从结果可以看出,fun2中仍然可以输出str3,因为它的父级作用域为全局作用域,且全局作用域中存在str3变量.

d)关于上面说的父级作用域,还有一种情况,就是假如调用的是函数,即函数嵌套时,父级作用域的指代.

这点容易让人迷惑,误以为会输出Eric,但结果却不是这样的,结果如下:

从结果可以看出,输出的是gaohui而不是Eric,此时的父级作用域指的是函数定义地方作用域的父级作用域,而不是函数调用的地方的父级作用域,这也就说明函数的作用域确实是在定义这个函数的时候就确定了,而不是其执行的时候.


在此只是对面试过程中关于js的作用域方面的问题做了简单的分析,其中涉及到更为复杂的js原型链的问题没有深入说明,若想深究,搞明白,可参考这边博文http://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B%E9%93%BE/

面试过程中javascript原型链与作用域的问题的更多相关文章

  1. 图解JavaScript中的原型链

    转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...

  2. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = { d: 40 }; var a = { x: 10, calculate: function (z) ...

  3. javascript原型链继承

    一.关于javascript原型的基本概念: prototype属性:每个函数都一个prototype属性,这个属性指向函数的原型对象.原型对象主要用于共享实例中所包含的的属性和方法. constru ...

  4. JavaScript学习总结(十七)——Javascript原型链的原理

    一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中, ...

  5. JavaScript原型链及继承

    在JavaScript中,所有的东西都是对象,但是JavaScript中的面向对象并不是面向类,而是面向原型的,这是与C++.Java等面向对象语言的区别,比较容易混淆,因此把我自己学习的过程记录下来 ...

  6. 理解js中的原型链

    对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性. 关于原型 在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承 ...

  7. JavaScript原型链及其污染

    JavaScript原型链及其污染 一.什么是原型链? 1.JavaScript中,我们如果要define一个类,需要以define"构造函数"的方式来define: functi ...

  8. 明白JavaScript原型链和JavaScrip继承

    原型链是JavaScript的基础性内容之一.其本质是JavaScript内部的设计逻辑. 首先看一组代码: <script type="text/javascript"&g ...

  9. 资料--JavaScript原型链

    JavaScript原型链 原文出处:https://www.cnblogs.com/chengzp/p/prototype.html 目录 创建对象有几种方法 原型.构造函数.实例.原型链 inst ...

随机推荐

  1. 2015-10-09 Fri 晴 加快进度看书

    最近老感觉每天不够用,每天7点起来,吃饭完了8点开始看书,不知道是我看书太慢了还是时间过得真的很快,不知不觉中午就到了.而这个时候我才看2章的内容,下午能多看3章内容.一本书也就一天的时候,而我现在还 ...

  2. Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。

    先上一个 位图和矢量图的 说明.http://zhidao.baidu.com/link?url=xwvs5CBzWeh15O3Ee4bICwCqg4PCQWwg5oZ0a6CVydbVZzufqrI ...

  3. Oracle自定义数据类型 2 (调用对象方法)

    调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create   table   <表名>   of   <对象类型>意义 ...

  4. Android 动画深入解析

    http://blog.csdn.net/rain_butterfly/article/details/39642613

  5. ZOJ 2599 Graduated Lexicographical Ordering (数位DP)

    首先要吐两行槽:看到集训队论文上有这道题,由于数位DP一律写成记忆化搜索形式的强迫症,就没去看论文上的几个函数是什么……:结果被这道题虐的脑细胞死光……,最后是用随机数据对拍AC程序然后发现BUG改掉 ...

  6. Linux基本命令(7)文件阅读的命令

    文件阅读的命令 命令 功能 head 查看文件的开头部分 tail 查看文件结尾的10行 less less是一个分页工具,它允许一页一页地(或一个屏幕一个屏幕地)查看信息 more more是一个分 ...

  7. [转]SqlPlus安装配置

    本文转载自http://blog.csdn.net/wuxiaoyan_home/article/details/4826440 一.下载oracle 10g sqlplus软件 http://www ...

  8. 【C#】用C#通过读取数据库方式读取CSV文件

    using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...

  9. bzoj 3594 [Scoi2014]方伯伯的玉米田(DP+二维BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题意] 给定一个n个数的序列,有K次将一个区间内的数加1的机会,问最长不下降子 ...

  10. 通过VMware Tools 将主机windows的目录共享给linux虚拟机

    之前有写过 本地虚拟机挂载windows共享目录搭建开发环境 这篇,里面讲通过使用samba来实现网络共享 最近发现其实完全不用这么麻烦,VMware tools就可以帮助我们轻松的共享文件夹 这里引 ...