zoukankan      html  css  js  c++  java
  • 我对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
  • 相关阅读:
    Python之Sklearn使用教程
    Centos 查看路径下所有文件中是否包含指定字符
    Centos7x 开启6379端口,Centos7x开启端口
    分享几个ip定位api【转】
    @Scheduled(cron = "* * * * * *")
    QueryRunner的使用
    linux redis重置密码、重启
    nginx里的sticky的作用
    windows环境xampp搭建php电商项目/搭建禅道
    hive中解决中文乱码
  • 原文地址:https://www.cnblogs.com/voctrals/p/4250097.html
Copyright © 2011-2022 走看看