JavaScript几个重要的特性学习

一.作用域

表示变量或函数起作用的区域,指代了它们在什么上下文中执行,Javascript总作用域一共有两种:全局作用域和本地作用域,在Javascript中本地作用域是按照函数来区分的。

var global = "11"; //全局作用域
function fun() {
    var local = "22";//本地作用域1
}
function fun2() {
    var local2 = "22";//本地作用域2
    for (var i=0;i<100;i++) {
        //本地作用域2
    }
}
JavaScript的作用域和C#的或者Java的作用域不是太一样,C#和Java中一个"{}"就是一个作用域,而JavaScript本地作用域是用函数来区分的;全局作用域是以window对象来区分的。

二.作用域链

与"“原型链”类似,Javascript的作用域链也是按有顺序查询的。在访问变量时,先查看本地作用域是否有此变量,如果没有则依次向上一级作用域查找直到全局作用域。如果全局作用域也没有此变量,那么将会返回“undefined”。

 function A() {
            name = "全局变量";
            this.local = "局部变量";
        }
        var a = new A();
        alert(name);//全局变量
        alert(a.local);//局部变量
        alert(a.age);//undefined

三.闭包

表示能访问和操作其他内部作用域的变量的表达式(通常是函数)。用简单的语言描述就是:能操作其他本地作用域变量的函数就是闭包。还是看代码:

function fun() {
    var i = 1;
    return function() {
        i++;
        console.log(i);
    }
}
var closure = fun();
closure(); //2
closure(); //3

请先按Java语言或其他非闭包语言的逻辑思考。当fun函数执行完毕时,其内部变量i应该会被释放,当closure函数再此执行并调用i时输出错误(因为i未被声明)。但是在Javascript中却打印出了值,这一切都归功于闭包。在执行fun()函数时,闭包就被创建。此时i并没有被释放,closure依然可以被访问到。

另外注意闭包的本质是表达式(通常是函数),所以闭包是在函数生成时定义的。(上面代码的第3行定义闭包)!

四.闭包的作用

  闭包最大的作用就是来阻止外部程序随意访问内部变量,只能通过提供的接口来访问和操作。如下面一个记数器的实现:
var counter = (function() {
    var i=0;
    return {
        add:function() {
            i++;
            return this;
        },
        get:function() {
            return i;
        }
    }
})();
counter.add().add().add();
console.log(counter.get()); //3
如果不用闭包直接暴露变量,那就会出现如下的情况产生bug:
i=0;
function add() {
    i++;
}
add();
add();
i+="1";
add();
console.log(i);//22

五.上下文

又可以理解为上下文对象,表示当前代码执行时所处的环境。即是this变量所指代的对象;这么理解比较困难,直接看个例子:

function Test() {
    console.log(this);
}
Test();    //window
new Test();//Object

在执行Test()时,此时的上下文对象是window,即Javascript的全局对象!在执行new Test();时新建了一个Object,此时执行Test函数的上下文对象就是Object。

本文参网上搜索的内容,如有侵权,请联系我。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。