美文网首页
day06(2017.10.9)

day06(2017.10.9)

作者: 晴_eeca | 来源:发表于2017-10-09 21:40 被阅读12次

    一、变量声明提升

    引擎解释javascript代码的之前会对其进行编译。在编译过程中会查找所有声明,并用合适作用域将他们关联起来。换句话说,在代码执行之前,会对作用域链中所有变量和函数声明先处理完先。所以,当遇到var a='hello world'中是 var a是先在编译阶段执行,然后在执行a='hello world'。

    百度

    var a = "hello world";
    var a;
    console.log(a);  //输出结果是“hello world”
    
    console.log(a);  //输出结果是“undefined”
    var a = "hello world";
    
    第一段代码实质上是:
    var a;
    a='hello world';
    console.log(a);  //输出“hello world”
    
    总结一句话就是:只有声明被提升,而赋值或其他运算会留在原地。所以第二段代码实际上就是:
    var a;
    console.log(a);   //输出结果是“undefined”
    a='hello world';
    

    二、函数声明提升

    函数两种创建方式
    1.函数声明
    fn('hello world');   //输出“hello world”
    function fn(name){
        console.log(name);
    }
    
    2.函数表达式
    fn('hello world');
    var fn= function(name){
        console.log(name);
    }
    运行上面的代码,会报错Uncaught ReferenceError: fn is not defined(…),错误信息显示说fn没有被定义。
    
    总结一句话就是:函数声明提升,函数声明语句将会被提升到外部脚本或者外部函数作用域的顶部(跟变量提升非常类似)。
    案例:
    var getName = function(){
        console.log(2);
    }
    function getName (){
        console.log(1);
    }
    getName();
    
    函数声明function getName(){}的声明会被提前到顶部。而函数表达式var getName = function(){}则表现出变量声明提升。
    因此在这种情况下,getName也是一个变量,因此这个变量的声明也将提升到底部,而变量的赋值依然保留在原来的位置。
    因此上面的函数可以转换成下面的样子:
    
    var getName;    //变量声明提升
    function getName(){    //函数声明提升到顶部
        console.log(1);
    }
    getName = function(){    //变量赋值依然保留在原来的位置
        console.log(2);
    }
    getName();    // 最终输出:2
    

    三、内置对象、本地对象、宿主对象

    1、宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序
    如:web浏览器,一些桌面应用系统等。即由web浏览器或是这些桌面应用系统造就的环境即宿主环境
    
    2、本地对象:ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
    “本地对象”包含哪些内容:
    Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、
    EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
    由此可以看出,简单来说,本地对象就是 ECMA-262 定义的类(引用类型)
    
    3、内置对象:ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、
    独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”
    ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
    
    4.宿主对象:由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。
    
    5.自定义对象
    
    总结:JS中,可以将对象分为“内部对象”、“宿主对象”和“自定义对象”三种
    1,内部对象
    js中的内部对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、
    RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、
    SyntaxError和TypeError。
    其中Global和Math这两个对象又被称为“内置对象”,这两个对象在脚本程序初始化时被创建,不必实例化这两个对象
    
    2.宿主对象
    宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是
    浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。
    不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。
    浏览器对象有很多,如Window和Document等等。
    
    3.自定义对象
    顾名思义,就是开发人员自己定义的对象。JS允许使用自定义对象,使JS应用及功能得到扩充
    

    相关文章

      网友评论

          本文标题:day06(2017.10.9)

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