本文阐述了JavaScript作用域、闭包、对象和原型链的概念和用法。分享给大家参考,如下:
如上所述,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};
满足以下条件的变量属于全局范围:
将已定义变量隐藏在最外面的已定义变量全局对象的属性中的任何位置。
对于前者,NodeJS的编程风格可以解释问题;对于后者,函数内部的局部变量对外部是不可见的,但可以提供访问函数来访问和修改相应的局部变量,从而实现OO封装的意图。
从示例中可以看出,我们可以通过不同的变量引用函数,并以不同的方式调用上下文。
传递和绑定上下文
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
下面我们将主要介绍原型链
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编程有所帮助。