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 相关文章推荐
JS 继承实例分析
Nov 04 Javascript
在图片上显示左右箭头类似翻页的代码
Mar 04 Javascript
JavaScript等比例缩放图片控制超出范围的图片
Aug 06 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
jquery中checkbox使用方法简单实例演示
Nov 24 Javascript
js运动应用实例解析
Dec 28 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
Jan 06 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
Vue服务器渲染Nuxt学习笔记
Jan 31 Javascript
vue-router 2.0 跳转之router.push()用法说明
Aug 12 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
php实现的双色球算法示例
2017/06/20 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
js 金额文本框实现代码
2012/02/14 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
Python入门篇之文件
2014/10/20 Python
浅谈Python中数据解析
2015/05/05 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
电大物流学生的自我评价
2013/10/25 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
付款承诺函范文
2015/01/21 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript