美文网首页
Javascript的一些原理

Javascript的一些原理

作者: zhCN_超 | 来源:发表于2017-07-13 21:34 被阅读5次

    2016/05/11
    整理一些ECMAScript 5容易忽视的概念。

    函数

    定义

    foo();
    // 函数声明
    function foo(){
      // do something
    };
    foo();
    

    因为解析器“函数声明提升”(function declaration hositin),所以任何位置都可以调用函数

    foo(); // 错误
    // 函数表达式
    var foo = function(){
      // do something
    };
    foo();
    

    因为解析器“变量声明提升”,如果在var之前调用会报错,因为只声明未赋值

    执行

    让定义的函数立即执行:

    // 函数声明
    (function(){
      // do something
    })();
    // 函数表达式
    var foo = function(){
      // do something
    }();
    

    基本包装类型

    基本类型的值可以调用方法,是因为3个特殊的引用类型:BooleanNumberString的存在。

    var str = 'Counter Seven'; // 基本类型
    var substr = str.substring(2);
    

    变量str不是对象,但可以调用substring方法,因为解析器在第2行顺序str做了以下操作:

    var str = new String('Counter Seven');  // 创建`String`类型的实例
    str.substring(2);                       // 在实例上调用`substring`方法
    str = null;                             // 销毁实例
    

    NumberBoolean同理。

    原型

    function foo(){
      // do something
    }
    
    // 原型
    foo.prototype.test = function(){
      // do something
    };
    
    // 重写原型
    foo.prototype = {
      test: function(){
        // do something
      }
    }
    
    • 每个函数都有一个prototype属性,它指向一个对象,这个对象我们暂且称为PT
    • PT会有一个constructor属性,指向原函数

    重写原型的问题是

    1. PTconstructor会指向Object构造函数
    2. 无法通过constructor确定对象类型
    3. 切断了实例与最初原型的联系,所以不能在重写原型之前实例化

    闭包

    function closure(){
      return function(){
        // do something
      }
    }
    var _closure = closure(); // closure 执行环境的作用域链已经被销毁,但是活动对象仍然在内存中
    _closure = null; // 销毁活动对象
    

    活动对象变量

    相关文章

      网友评论

          本文标题:Javascript的一些原理

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