手机版

JavaScript作用域、闭包、对象和原型链的概念和用法示例概述

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

本文阐述了JavaScript作用域、闭包、对象和原型链的概念和用法。分享给大家参考,如下:

1 JavaScript变量作用域

1.1 函数作用域

没有块作用域:也就是作用域没有被{}包围,它的作用域完成是由函数决定的,所以if /for等语句中的花括号不是独立的作用域。

如上所述,JS函数中定义的局部变量只在函数内部可见,称为函数作用域。

嵌套范围变量搜索规则:当函数中引用一个变量时,JS会搜索当前函数的范围,如果找不到,会搜索其上限范围直至全局范围。

var值='全局';var f1=function(){ console . log(v1);//全局};f1();var F2=function(){ var v1=' local ';console . log(v1);//本地};F2();词法范围规则:函数的嵌套关系是在定义时确定的,而不是在调用时确定的,即词法范围,即嵌套关系是由词法分析确定的,而不是由运行时确定的。

var v1=' globalvar f1=function(){ console . log(v1);} f1();//global var F2=function(){ var v1=' local ';f1();};F2();//全局对于这两个规则之间的交互,函数中任意位置定义的局部变量在进入函数时就已经定义好了,但如果没有初始化就没有定义,在变量赋值之前不会初始化。因此,如果访问未初始化的变量,我们将得到未定义的解释。

var v1=' globalvar f=function(){ console . log(v1);//未定义的var v1=' local};

1.2 全局作用域

全局范围内的变量是全局对象的属性,可以在任何函数中直接访问,不需要经过全局对象,但是添加全局对象可以提供搜索效率。

满足以下条件的变量属于全局范围:

将已定义变量隐藏在最外面的已定义变量全局对象的属性中的任何位置。

2 闭包

2.1 装饰的定义

函数f1(){//上下文定义函数F2(){//func define };返回F2;};F2();//获取f1中的上下文。在C/C这样的非函数式编程语言中,我们也可以定义一个函数指针并返回,但是为内部函数定义的上下文信息会在外部函数执行后被破坏,而在闭包中,返回的函数被保存并包含返回函数的上下文信息。(词法范围支持)在闭包返回后,单独创建上下文信息,这样就可以生成多个独立的闭包实例。

2.2 闭包的用途

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

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

3 对象

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

3.1 对象的创建与访问

JavaScript中的Object实际上是一个由属性组成的关联数组,属性由名称和值组成。您可以通过新建对象()或{}来创建对象。对于创建简单对象,可以使用对象初始值来创建对象,即创建具有{}文字值的对象,对象的属性名可以是带“”的字符串,也可以是不带引号的字符串。这对JS来说没什么区别。访问对象的属性时,可以使用句点或关联数组['name']。后者的优点是,当我们不知道对象的属性名时,变量可以作为关联数组的索引。

3.2 构造函数

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

3.3 上下文对象

在JS中,上下文对象就是这个指针,也就是被调用函数所在的环境。它的功能是在函数中引用调用对象本身。这种外观会影响前面介绍的静态范围,并添加动态内容。

从示例中可以看出,我们可以通过不同的变量引用函数,并以不同的方式调用上下文。

传递和绑定上下文

JavaScript函数可以通过调用和Apply动态绑定到特定的上下文。

如果要永久绑定上下文,可以使用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.getNamefunc();//JavaScript

3.4 原型

创建对象时,我们应该在构造函数中定义一般成员,但原型定义了成员函数。

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

JS中有两个特殊的对象:对象和函数,它们都是生成对象的构造函数。

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

JS对象可以分为三类:用户创建的对象、构造器对象和原型对象。

所有对象都有一个__proto__属性,它指向这个对象的原型。

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

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

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

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

更多对JavaScript相关内容感兴趣的读者可以查看本网站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript数学运算用法总结》、0103010

希望本文对JavaScript编程有所帮助。

版权声明:JavaScript作用域、闭包、对象和原型链的概念和用法示例概述是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。