学习笔记之JavaScript高级技巧

作用域和闭包


JavaScript和其他编程语言不同的一点是其变量作用域为函数级作用域,而非其他编程语言的块级作用域。也就是说,在一个函数内定义的变量在该函数内都能被访问到,怎么理解呢?看实例。下面这段代码的执行效果在控制台输出为"undefined"。
function scope(){
    if(false){
        var i = 0;
    }
    console.log(i);
}
scope();
执行过程并未报错,可见变量 i 是存在的。再看下面这段代码,只是简单地将 i 改为 j :
function scope(){
    if(false){
        var i = 0;
    }
    console.log(j);
}
scope();
其执行结果为Uncaught ReferenceError: j is not defined。这也引出了一个重要的点,undefined 和 not defined的区别,可以这么理解,前者变量是存在的,只是未初始化,而后者是直接找不到变量,未定义,执行报错。所以可以说写了即存在。第一段代码可以这么理解:
function scope(){
    var i;
    if(false){
        i = 0;
    }
    console.log(i);
}
scope();
实际上也的确是这样,可以理解为 var 有一个前置的动作(实际上function和变量都这样,比如以上代码把 "scope();" 放到最前面也依然正常执行)。另外,外部变量和内部变量访问范围和其他编程语言是一样的,在function外部的变量可以在function里面访问,而function内部的变量不能再其外直接访问。(实际上可以把最外层理解为一个大的function)
var i = 10;
function scope(){
    var j = 20;
    console.log(i);             //OK  10
}
scope();
console.log(j);                 //ERROR: j is not defined
接下来看看闭包,前面已经说过function内的变量在外部不能直接访问,要访问就需要用到闭包。看下面的代码:
function scope(){
    var i = 1000;
    return function(){
        return i;
    }
}
var t = scope()();
alert(t);                      //t = 1000
在外部拿到了变量i;(注意:闭包使用不当容易造成内存泄漏)

this指针


this指针只需要记住“谁调用指向谁”,不像其他语言一样指向当前域的归属,看下面的代码:
this.m = 1000;
var obj = {
    m:100,
    test:function test(){
        alert(this.m);
    }
}
obj.test();                    //100
alert(this.m);                 //1000
有一点特殊的是当遇到闭包的时候,由于返回的函数在执行的时候隶属于外部对象,所以此时this指向的是外部对象, 故下面的代码执行后为100, 1000:
this.m = 1000;
var obj = {
    m:100,
    test:function test(){
        alert(this.m);                 //100
        return function(){             
            alert(this.m);            //1000
        }
    }
}
obj.test()();                        

总结


以上只是JavaScript高级特性的冰山一角,JavaScript很灵活,这使得它一直在发展且非常受欢迎,但同时也有不少初学时的陷阱,用其他语言的很多共通特性强行来用到它上面的话很多时候估计会摔跟头。以上只是我的个人简介,如果你看到了这篇笔记有错误的地方,欢迎留言给我。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门