深入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 程序以阻塞方式在浏览器中运行的最长时间(秒);
• 变量名的最大长度。
深入js系列-环境的更多相关文章
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- Node.js系列-http
前言: 最近一直忙着公司项目的事,战友们的留言也没空回复,博客也有段时间没有更新了,年底了就是一个的忙啊~~~(ps:同感的也给个赞吧) 现在前端的就是一直地更新一直有新的东西出来,什么ES2015, ...
- Node.js系列-express(上)
前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...
- Nodejs学习笔记(一)—简介及安装Node.js开发环境
一.简介 Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言: Node.js采用的Javascript引擎是来自Google Chrome的V8:运行在浏览器外不用考虑 ...
- Node.js系列——(4)优势及场景
背景 之前几篇系列文章简单介绍了node.js的安装配置及基本操作: Node.js系列--(1)安装配置与基本使用 Node.js系列--(2)发起get/post请求 Node.js系列--(3) ...
- Linux虚拟机中 Node.js 开发环境搭建
Node.js 开发环境搭建: 1.下载CentOS镜像文件和VMWare虚拟机程序; 2.安装VMWare——>添加虚拟机——>选择CentOS镜像文件即可默认安装带有桌面的Linux虚 ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...
- Ember.js系列文章
JS前端框架之Ember.js系列文章 本文为文章索引,主要是罗列Ember.js的相关文章便于阅读. 相关演示代码:github for free. 基础篇 1. EmberJs之What|Why| ...
随机推荐
- laravel框架模型model的创建与使用方法
这篇文章给大家介绍的内容是关于laravel框架模型model的创建与使用方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.创建model 2. 1 2 3 4 5 6 7 8 ...
- Java 8——保存参数名称
一.详述 在很多情况下,程序需要保存方法参数名称,如Mybatis中的mapper和xml中sql的参数绑定.但是在java 8之前的编译器是不支持保存方法参数名至class文件中的. 所以很多框架都 ...
- 深入V8引擎-初始化之InitPlatform
上一篇其实想讲初始化的第二步,但是内容比较无聊,所以换了一个话题,谈了谈v8的命名空间和宏,稍微轻松一下. 在这里还是接着说说初始化过程,毕竟写博客的初衷是对自己努力的记录,不是为了吸粉,这篇没图,对 ...
- 关于IDEA中web项目中web.xml配置文件标红的解决办法
原文链接 https://blog.csdn.net/qq_33451695/article/details/86684127 解决方法前提:web.xml没有实际错误,但依然被web.xml标红 出 ...
- 2019-11-29-WPF-从触摸消息转触摸事件
原文:2019-11-29-WPF-从触摸消息转触摸事件 title author date CreateTime categories WPF 从触摸消息转触摸事件 lindexi 2019-11- ...
- c# 类实例序列化反序列化json文件 (原发布 csdn 2017-10-01 20:02:12)
前言 前段时间使用了net.json保存对象数据.添加完成后,测试发现300多实例数据保存加载json文件,速度比原方式(BinaryFormatter)慢.但是功能加上后也懒再删掉代码了,索性就采用 ...
- C#使用Redis实现网站统计访问数或点赞数功能!
1.安装.net操作Redis需要的NuGet包: 这里推荐使用:StackExchange.Redis,在程序包管理器控制台输入命令install-package stackexchange.red ...
- webapi 集成NLog
参考项目代码:SwaggerDemoApi 安装 打开nuget管理器--->搜索nlog,安装箭头所指的两个文件到你的项目中,config安装到你的API项目即可,nlog文件安装到你用得到n ...
- 在VS2019创建WebForm程序,开个箱
现在公司用的是VS2010+ASP.NET WebForm + DevExpress控件做系统开发,好老好老了,没办法,只能在这里尝一尝新鲜的味道. TMD,还以为马上创建,谁知还有一关!!! 还是那 ...
- 2019 浩德钢圈java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.浩德钢圈等公司offer,岗位是Java后端开发,因为发展原因最终选择去了浩德钢圈,入职一年时间了,也成为了面 ...