JavaScript作用域、闭包、对象与原型链概念及用法实例总结


Posted in Javascript onAugust 20, 2018

本文实例讲述了JavaScript作用域、闭包、对象与原型链概念及用法。分享给大家供大家参考,具体如下:

1 JavaScript变量作用域

1.1 函数作用域

没有块作用域:即作用域不是以{}包围的,其作用域完成由函数来决定,因而if /for等语句中的花括号不是独立的作用域。

如前述,JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域。

嵌套作用域变量搜索规则:当在函数中引用一个变量时,JS会搜索当前函数作用域,如果没有找到则搜索其上层作用域,一直到全局作用域。

var value = 'global';
var f1 = function(){
 console.log(v1); //global
};
f1();
var f2 = function(){
 var v1 ='local';
 console.log(v1); //local
};
f2();

词法作用域规则:函数的嵌套关系是定义时决定的,而非调用时决定的,即词法作用域,即嵌套关系是由词法分析时确定的,而非运行时决定。

var v1 = 'global';
var f1 = function(){
 console.log(v1);
}
f1(); //global
var f2 = function(){
 var v1 = 'local';
 f1();
};
f2(); //global

对于这两个规则的相互作用,函数内无论什么位置定义的局部变量,在进入函数时都是已经定义的,但未初始化,即为undefined,直到运行到变量被赋值时才被初始化,因此若访问了未初始化的变量,我们会得到undefined的说明。

var v1 = 'global';
var f = function(){
 console.log(v1); //undefined
 var v1 = 'local';
};

1.2 全局作用域

全局作用域的变量是全局对象的属性,不论在什么函数中都可以直接访问,而不需要通过全局对象,但加上全局对象,可以提供搜索效率。

满足下列条件的变量属于全局作用域:

  • 在最外层定义的变量
  • 全局对象的属性
  • 任何地方隐匿定义的变量。

2 闭包

2.1 装饰的定义

function f1(){
 //context define
 function f2(){
 //func define
 };
 return f2;
};
f2(); //获得f1中的context

在类似C/C++这种的非函数式编程语言中,我们也可以定义函数指针并返回,但外层函数在执行结束后为内层函数定义的上下文信息会被销毁,而在闭包中,则保存了返回的函数,还包含返回函数的上下文信息。(由词法作用域所支持)而且在返回闭包之后,上下文信息即被单独创建出来,从而可以生成多个互相独立的闭包实例。

2.2 闭包的用途

闭包有两个用途,一是方便实现嵌套的回调函数,二是隐藏对象的细节。

对于前者,NodeJS的编程风格已经可以说明问题,对二后者,对于函数内部的局部变量外部是不可见的,但可以提供访问函数来访问和修改相应的局部变量,从而实现OO封装的意图。

3 对象

在基于类型的语言中,对象是由类实例化,而JS是基于原型的系统,对象是由原型复制生成的。

3.1 对象的创建与访问

JavaScript中的Object实际上就是一个由属性组成的关联数组,属性由名称和值组成。可以由new Object(){}来创建对象。对于创建简单对象,可以使用对象初始化器来创建对象,即由{}字面值来创建对象,对象的属性名可以为加''的字符串,也可不加引号。这对JS来说没有区别,访问对象的属性时,可以使用句点也可使用关联数组['name'],后者的好处是当我们不知道对象属性名时,可以由变量来作为关联数组的索引。

3.2 构造函数

我们也可以通过自定义构造函数来生成对象,从而能实例化更多的对象。构造函数也是函数,我们需要用大写的函数名即可。在函数中可以定义成员变量,成员函数等。

3.3 上下文对象

在JS中,上下文对象即this指针,即被调用函数所处的环境。其作用是在函数内部引用到调用它的对象本身。this的出现会之前介绍的静态作用域产生影响,加入了动态的内容。

由例子可以看到,我们可以通过不同的变量引用函数,不同之处调用上下文。

传递与绑定上下文

JavaScript的函数可以通过CallApply来动态绑定到特定的上下文。

如果想永久的绑定上下文,可以使用bind函数,需要注意的是同一函数上的多次bind是没有效果的。

var person = {
 name:'noname',
 getName:function(){console.log(this.name); }
};
var bill = {name:'Bill'};
person.getName(); //noname
bill.getName = person.getName;
bill.getName();   //Bill
name = 'JavaScript';
func = person.getName;
func();   //JavaScript

3.4 原型

创建对象时,我们应该在构造函数内定义一般成员,而是其原型定义成员函数。

下面我们会主要介绍原型链

JS中有两个特殊的对象:Object与Function,它们都是构造函数,用于生成对象。

Object.prototype是所有对象的祖先,Function.prototype是所有函数的原型,包括构造函数。

可以将JS的对象分为三类:用户创建对象,构造函数对象,原型对象。

所有对象中都有一个__proto__属性,其指向此对象的原型。

构造函数对象有prototype,指向其原型对象,通过此构造函数创建对象时,新创建对象的__proto__属性将会指向构造函数的prototype属性。

原型对象有一个constructor属性,指向它对应的构造函数。

function Foo() {}
var obj = new Object();
var foo = new Foo();

JavaScript作用域、闭包、对象与原型链概念及用法实例总结

参考文献:《Node.JS开发指南》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
取得父标签
Nov 14 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
Jan 01 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
javascript图片滑动效果实现
Jan 28 Javascript
js实现仿微博滚动显示信息的效果
Dec 21 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
Dec 25 Javascript
关于vue-router路径计算问题
May 10 Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
微信小程序之裁剪图片成圆形的实现代码
Oct 11 Javascript
vue移动端项目缓存问题实践记录
Oct 29 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 Javascript
RequireJS用法简单示例
Aug 20 #Javascript
JavaScript实现多态和继承的封装操作示例
Aug 20 #Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
Aug 20 #Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 #Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
Aug 20 #Javascript
获取layer.open弹出层的返回值方法
Aug 20 #Javascript
react.js组件实现拖拽复制和可排序的示例代码
Aug 20 #Javascript
You might like
php中一个完整表单处理实现代码
2011/11/10 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
Vue实现todo应用的示例
2021/02/20 Vue.js
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python中的set实现不重复的排序原理
2018/01/24 Python
Python多进程原理与用法分析
2018/08/21 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
python的等深分箱实例
2019/11/22 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
原料仓管员岗位职责
2014/04/12 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
2014年法务工作总结
2014/12/11 职场文书
母亲节寄语大全
2015/02/27 职场文书
初二物理教学反思
2016/02/19 职场文书
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS