• 我对javascript的自以为是


     参数的作用域

    if(true){
        var tester = "Hello World";
    }
    
    console.log(tester);

    按照以往的经验,觉得上面的代码会报错,而实际不会。

    javascript中if, for这两个语句的{}并不会形成一个密闭的空间,以至于其中声明的变量外界访问不到。

    所以这里的tester是存在的。

    实际上能够形成这种密闭空间的只有function,或者称为其作用域的产生完全由函数来决定

    function test() = {
        if(true){
            var tester = "Hello World";
        }
    }
    console.log(tester); // error

    而这样的话就没有问题:

    function test() = {
        if(true){
            var tester = "Hello World";
        }
    }
    test();
    console.log(tester); // "Hello World"

    变量初始化

    javascript的函数中定义变量的位置跟java不同,如下:

    var tester = "Hello world";
    
    function test(){
        console.log(tester);
        var tester = "again";
    }
    
    test(); // undefined

    出现这种状况的原因是var tester = "again";在test形成的作用域中,尽管在执行console.log的时候没有被初始化,但是这个变量是存在的。

    var tester = "Hello world";
    
    function test(){
        var tester = "again";
        console.log(tester);
    }
    
    test(); // again

    call, apply, bind相同点和区别

    相同点: 他们都是用来改变方法中this所指定的上下文的。

    不同点:

    假如有method方法, foo对象, arg1和arg2两个参数。

    1 call vs apply, 参数的类型

    method.call(foo, arg1, arg2);

    method.apply(foo, [arg1, arg2]);

    2 call vs bind

    bind方法的返回值是函数!!!

    method.call(foo, arg1, arg2);

    method.bind(foo, arg1, arg2)();

    method.bind(foo)(arg1, arg2);

    javascript中的私有变量,静态变量,实例变量

    不知道我可不可以这么说,javascript中的讲台变量和实例变量的苛刻程度或者说明确程度比java要高。

    私有变量

    function Person(){
        var name = 'voctrals';
        var display = function(){
            console.log(this.name);
        }
    }

    其中的name和display都是私有变量,在方法外是无法访问到的。

    var person = new Person();
    console.log(person.name);    // undefined
    console.log(typeof person.display);    // undefined

    严格到这种程度也够拼的。即使是person对象也不能够访问到。

    静态变量

    javascript的静态变量真的是属于类的,不属于对象,甚至对象都不能够访问到。

    function Person(){
    }
    Person.name = 'voctrals';
    Person.display = function(){
        console.log(this.name);
    }

    这样一来name和display就是Person这个类的静态变量了。

    console.log(Person.name);    //'voctrals'
    console.log(typeof Person.display);    // function
    
    var person = new Person();
    console.log(person.name);    // undefined
    console.log(typeof person.display);    // undefined

    实例变量

    实例变量就是指方法内部的变量,但是这个变量是由this引用的,不然的话就成为全局变量了。

    function Person(){
        this.name = 'voctrals';
        this.display = function(){
            console.log(this.name);
        }
    }

    实例变量属于实例,一个实例的改变肯定不会影响到另外一个实例的变量。

    var person1 = new Person();
    person1.name='voctrals again';
    console.log(person1.name);    // voctrals again
    console.log(typeof person1.display);    // function
    var person2 = new Person();
    console.log(person2.name);    // voctrals
    console.log(typeof person1.display);    // function
    
    console.log(Person.name);    // undefined
    console.log(typeof Person.display);    // undefined
  • 相关阅读:
    转发 微博 Qzone 微信 草根创业英雄时代落幕:贾跃亭戴威们一去不复返
    python 发送大Json格式数据
    python post json数据
    python post 参数
    IntelliJ Idea 常用10款插件(提高开发效率)
    IDEA操作技巧:一些常用且实用的插件
    nacos
    Sentinel 与 Hystrix 的对比
    阿里启动新项目:Nacos,比 Eureka 更强!
    D3.js学习(一)
  • 原文地址:https://www.cnblogs.com/voctrals/p/4250097.html
Copyright © 2020-2023  润新知