• 深入js系列-环境


    javascript运行环境

    js如果只在引擎中运行,它会严格遵循并且可以预测的,但是js几乎都在宿主环境中运行,浏览器或者Node环境

    ECMAScript中的Annex B

    介绍了浏览器兼容性问题导致与官方规范的差异

    • 在非严格模式中允许八进制数值常量存在,如0123(即十进制的83)。
    • window.escape(..) 和window.unescape(..) 让你能够转义(escape)和回转(unescape)
    带有% 分隔符的十六进制字符串。例如,window.escape( "? foo=97%&bar=3%" ) 的结果
    为"%3Ffoo%3D97%25%26bar%3D3%25"。
    • String.prototype.substr 和String.prototype.substring 十分相似,除了前者的第二个
    参数是结束位置索引(非自包含),后者的第二个参数是长度(需要包含的字符数)。
    
    Web ECMAScript规范,介绍官方ECMAScript和目前浏览器中JavaScript实现的差异
    <!-- 和--> 是合法的单行注释分隔符。
    • String.prototype 中返回HTML 格式字符串的附加方法:anchor(..)、big(..)、
    blink(..)、bold(..)、fixed(..)、fontcolor(..)、fontsize(..)、italics(..)、
    link(..)、small(..)、strike(..) 和sub(..)。
    以上内容在实际开发中很少使用,也不推荐,我们更倾向于使用其他的内建
    DOM API 和自定义工具集。
    • RegExp 扩展:RegExp.$1 .. RegExp.$9(匹配组) 和RegExp.lastMatch/RegExp["$&"](最
    近匹配)。
    • Function.prototype 附加方法:Function.prototype.arguments(别名为arguments 对象)
    和Function.caller(别名为arguments.caller)。
    
    宿主对象 由宿主对象创建并提供给js引擎的变量,包括内建对象和函数

    常见的宿主对象,如下例子

    var a = document.createElement( "div" );
    typeof a; // "object"--正如所料
    Object.prototype.toString.call( a ); // "[object HTMLDivElement]"
    a.tagName; // "DIV"
    

    需要注意宿主对象的行为差异

    • 无法访问正常的object 内建方法,如toString();
    • 无法写覆盖;
    • 包含一些预定义的只读属性;
    • 包含无法将this 重载为其他对象的方法;
    
    全局DOM变量

    一个不太为人所知的事实是:由于浏览器演进的历史遗留问题,在创建带有id 属性
    的DOM 元素时也会创建同名的全局变量

    <div id="foo"></div>
      if (typeof foo == "undefined") {
        oo = 42; // 永远也不会运行
      }
    console.log( foo ); // HTML元素
    

    当页面出现多个id同名时,我们可以直接使用该全局变量来获取同id的HTMLCollection

    故意设置两个id同名,当然编码时不推荐,简易保持唯一

    使用id作为变量名来获取同名DOM

    原生原型

    不要扩展原生原型,因为随着规范发展,扩展的功能可能会被实现,使得扩展和规范冲突

    必要的扩展建议作如下处理

    if (!Array.prototype.push) {
    // Netscape 4没有Array.push
      Array.prototype.push = function(item){
        this[this.length-1] = item;
      };
    }
    
    shim/polyfill

    polyfill 能有效地为不符合最新规范的老版本浏览器填补缺失的功能,让你能够通过可靠的代码来支持所有你想要支持的运行环境,shim/polyfill能够填充新的API,但是没法填充新的语法,我们可以使用bable来将新的语法转换成旧的语法

    保留字

    宿主环境实现的限制

    下面列出一些已知的限制:

    • 字符串常量中允许的最大字符数(并非只是针对字符串值);
    • 可以作为参数传递到函数中的数据大小(也称为栈大小,以字节为单位);
    • 函数声明中的参数个数;
    • 未经优化的调用栈(例如递归)的最大层数,即函数调用链的最大长度;
    • JavaScript 程序以阻塞方式在浏览器中运行的最长时间(秒);
    • 变量名的最大长度。
  • 相关阅读:
    WinSCP命令行操作
    Android SDK platforms build-tools等镜像下载
    Ubuntu 18.04 下配置 HAXM 加速 Android模拟器
    HDU 2222 Keywords Search
    获取Android自己写好了的apk以及反编译
    Linux下几个常用的快捷键,真的很实用
    Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
    高仿“点触验证码”做的一个静态Html例子
    我的华为面试经历——技术服务
    数据库日期类型转换–HSQL
  • 原文地址:https://www.cnblogs.com/sefaultment/p/10574361.html
Copyright © 2020-2023  润新知