JS块级作用域和私有变量实例分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS块级作用域和私有变量实例分析相关的知识,希望对你有一定的参考价值。

参考技术A 本文实例讲述了JS块级作用域和私有变量。分享给大家供大家参考,具体如下:
块级作用域
(function()
//这里是块级作用域
)()
例如:
(function()
for(var
i=0;i<5;i++)
alert(i);//0,1,2,3,4

)();
alert(i);//error
上例中,定义了一个块级作用域,变量i在块级作用域中可见的,但是在块级作用域外部则无法访问。
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
私有变量
任何在函数中定义的变量,都可以认为是私有变量。因为不能在函数的外部访问这些变量。私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。
我们把有权访问私有变量和私有函数的公有方法称为特权方法:
function
MyObject()
//私有变量和私有函数
var
privateVariable
=
10;
function
privateFunction()
return
false;

//特权方法,特权方法作为闭包有权访问在构造函数中定义的所有变量和函数
this.publicMethod
=
function
()
privateVariable++;
return
privateFunction();
;

var
obj
=
new
MyObject();
obj.publicMethod();//
原型模式定义共有方法:
(function()
//私有变量和私有函数
var
privateVariable
=
10;
function
privateFunction()
return
false;

//构造函数
MyObject
=
function()
;
//公有/特权方法
MyObject.prototype.publicMethod
=
function()
privateVariable++;
return
privateFunction();
;
)();
模块模式:
var
singleton
=
function()
//私有变量和私有函数
var
privateVariable
=
10;
function
privateFunction()
return
false;

//特权/公有方法和属性
return

publicProperty:
true,
publicMethod
:
function()
privateVariable++;
return
privateFunction();

;
();
更多关于javascript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
您可能感兴趣的文章:详解JavaScript
新语法之Class
的私有属性与私有方法JavaScript私有变量实例详解浅谈js继承的实现及公有、私有、静态方法的书写深入了解JavaScript
私有化

JavaScript中作用域和作用域链解析

  学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别。

一.js没有块级作用域。

  js没有块级作用域,就像这样:

if(){
   var a = 100
  console.log(a) //输出100 } console.log(a)
//输出100

  js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,所以说,js没有块级作用域。

二.js的全局变量

  js中规定,全局变量都可以看作是window的属性,而且全局变量能够被所有的代码块读取。

  

var a = 10;
function() {
  b = 20; console.log(a);
//输出10; }
console.log(b); //输出20;

  虽然在匿名函数中对a没有定义,但是由于a是全局变量,所以其他任何的代码块都能够读取a的值。在一个复杂的项目中,全局变量如果操作不慎,很有可能带来重大的bug。所以在平时写代码的时候,应该尽量避免使用全局变量!对于一个变量来说,如果没有用var来声明的话,那么会自动认为是全局变量,因此,在书写中,一定不能漏写var。

三.js的局部变量

  js中的全局变量,很容易使代码存在问题,所以我们应该明确区分全局变量和局部变量!局部变量只在他所在的函数内部读取,在函数外部却无法读取这个变量。

  

function doSomething(){
    var blogName="智轩资本";
    function innerSay(){
        alert(blogName);
    }
    innerSay();
}
alert(blogName); //undefined
innerSay(); //undefined

四.js的作用域链问题

  由于js存在全局变量和局部变量,在调用一个变量是,会对他的作用域链进行查找,如果函数内部定义了这个变量,那么取该变量的值,如果没有,那么向上一层查找,如果找到了,就获取这个值,如果还没找到,继续往上层查找,直到找到位置,如果找到最后也没找到,那么该变量的值为undefined。

  先看一个例子:

  

var myName = \'智轩资本\';
function scoap() {
     console.log(myName);
    var myName = "zhixuan";
    console.log(myName);
    console.log(age);

}
scoap();

  先分析一下这个例子,scoap()将调用这个函数,第一个console.log(name),会对name的值进行原型链查找,首先看函数scoap内部是否进行了定义,发现在函数内部对name进行了定义,那么第一个console.log(name)将不再往上层查找!那么第一个console.log(name)的值是不是就是“zhixuan”了呢?no!no!no!由于第一个console.log(name)时,对name还没有赋值,所以,第一个console.log(name)为undefined,第二个console.log(name)为“zhixuan”!

  再看一个例子:

  

var a = 10;
function zhixuan() {
    console.log(a);
}
function ziben() {
    var a = 20;
    zhixuan();
}
ziben();

  这次console.log(a)的值为多少呢?首先执行ziben()函数,里面定义了a为20,再执行zhixuan()函数,要求输出a的值,由于作用域在函数定义的那一瞬间就决定了,所以,zhixuan()函数会向上查找到a的全局变量,即var a=10,而不是演着ziben()里的作用域查找!所以console.log(a)为10.

  当然,我的这些理解比较浅,如果想要继续深入,推荐阅读:

  http://www.laruence.com/2009/05/28/863.html

  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html

以上是关于JS块级作用域和私有变量实例分析的主要内容,如果未能解决你的问题,请参考以下文章

let与const详解

js函数作用域和块级作用域的区别

什么是块级作用域,为什么说js没有块级作用域

下面JavaScript代码如何理解?块级作用域如何理?

第四章—变量,作用域和内存问题

第四章—变量,作用域和内存问题