美文网首页
javascript基础学习(2017-07-12 )

javascript基础学习(2017-07-12 )

作者: 老夫编程就是一把梭 | 来源:发表于2017-07-12 17:18 被阅读0次

    为何想要开一个javascript文集呢,主要是自己的js基础太差了,决定从0开始重新学习,用此系列博客记录我自己的学习路程。


    值和引用

    在javascript中,我们有两种方法来保存数据:值和引用。这里要提一下js的基本数据类型和引用类数据类型。

    基本数据类型:Null,undefined,boolean,String,Number,以及es6新加的symbol(一但创建就不可修改)。

    引用类数据类型:Object (Function,Array,Date,RegExp)。

    对于基本类型,值都是直接赋值到变量中的;而对于引用类型,变量的值都是通过指针指向内存中的对象,同一个对象可能会有多个变量同时指向自身,当其中某个变量修改对象中的值时候,其他引用此对象的变量中的值也会相应得改变。

    我们来看点代码示例:

    var a = 5;
    var b = 5;
    a = 6;
    console.log(b); // 这里的答案是5;因为a和b都是赋值为基本数据类型Number
    
    var a = {};
    var b = a;
    b.addsth = something;
    console.log(a.addsth);// 这里会发现a中也有了addsth属性。因为a和b都是对对象{}的引用。
    
    var arr = [1, 2, 3];
    var testarr = arr;
    arr.push(4);
    console.log(arr == testarr) // true,因为两者都是指向[1, 2, 3]这个数组对象。arr改变了原始引用对象值,导致testarr值也相应改变
    
    var arr = [1, 2, 3];
    var testarr = arr;
    arr = [3, 3, 4];
    console.log(testarr) // [1, 2, 3]
    // 因为两者本来都是指向同一个数组对象,但后来arr的指向改变了,testarr并没有。
    

    作用域

    在es6之前,js中只有两种作用域,那就是全局作用域以及函数作用域,虽然如此,但使用要格外注意。

    var a = '我是全局变量';
    function abc () {
        var a = '我是局部变量';
        console.log(a) // 如方法abc调用,则答案是'我是局部变量'
    }
    console.log(a) // 答案是'我是全局变量';
    if (true) {
        var a = '我是新值'
    }
    console.log(a) // 答案是'我是新值';
    

    但是在es6中,增加了块级作用域,并有了新的定义变量关键词‘let’;这样一来,上面代码修改后运行结果会有一点区别。

    let a = '我是全局变量'
    function abc () {
        let a = '我是局部变量';
        console.log(a) // 如方法abc调用,则答案是'我是局部变量'
    }
    console.log(a) // 答案是'我是全局变量';
    if (true) {
        let a = '我是新值';
        console.log(a) // 答案是'我是新值'
    }
    console.log(a) // 答案是'我是全局变量';
    

    下面的代码中,由于没有在函数中声明变量作用域,导致函数执行后,变量变成了全局作用域下的值

    var a = 1;
    function abc () {
        a = 2
    }
    console.log(a); // 1
    abc();
    console.log(a); // 2
    // 全局作用域下的a被函数中的变量修改了。
    

    上下文

    我们可以用this来访问上下文,this主要指向你代码所处的执行环境

    var a = 123; // 全局变量a值是123
    function change (x) {
        this.a = x
    }
    change(222);
    console.log(a); // a的值被修改为222
    
    var obj = {
        a: 10
    }
    obj.change = change
    obj.change(20); // obj中a的值被修改为20,因为此时obj的change方法中的this,指向的是obj
    

    说到改变this指向的方法,不得不说一下call(),和apply()两个方法:apply的参数是数组形式,call的参数是单个的值,除此之外在使用上没有差别,重点
    理解这两个函数调用的 this 改变

    function changeColor (color){
        var this.style.color = color;
    };
    // 在window对象上调用的时候无法运行,因为window对象没有style属性
    // 比如现在有个div
    var div = document.getElementById('mydiv');
    changeColor.call(div, 'black');
    changecolor.apply(div,['black'])
    

    闭包

    闭包是一种手段:有权访问另一个函数作用域内变量的函数都是闭包。至少我是这么理解的~~
    这里简单介绍一下,后面会有专门的学习。

    function abc (){
        var a = 123;
        function cc () {
            console.log(a);
        }
        return cc;
    }
    var myfun = abc();
    myfun(); // 答案123
    

    相关文章

      网友评论

          本文标题:javascript基础学习(2017-07-12 )

          本文链接:https://www.haomeiwen.com/subject/wcibhxtx.html