深入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| ...
随机推荐
- 【排错】springboot项目,启动报An attempt was made to call the method com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; but it does not exist.
pom文件新引入: <dependency> <groupId>com.google.code.gson</groupId> ...
- springboot 获取到的inputStream为空的问题
springboot在接收http请求的时候读取的request的inputStream,造成我们想自己读取inputStream的时候发现inputStream已经无法读取了. 为了读取inputS ...
- scala基础题--函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔
函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔 import scala.io.StdIn object work02 { def main(args: Array[St ...
- MonkeyDev安装--逆向开发
MonkeyDev是原有iOS OpenDev的升级,非越狱插件的开发集成神器! 可以使用Xcode开发CaptainHook Tweak.Logos Tweak 和 Command-line Too ...
- 聊聊Lambda架构
定义 在数据分析场景中,我们可能会遇到这样的问题.例如,我们要做一个推荐系统,如果我们用批处理任务去做,一天或者一小时的推荐频次明显延迟太大.如果用流处理任务,虽然延迟的问题解决了,然而只用实时数据而 ...
- Vector线程安全,ArrayList非线程安全
http://baijiahao.baidu.com/s?id=1638844080997170869&wfr=spider&for=pc Vector线程安全,ArrayList非线 ...
- 将本地代码提交到github上
首先点击new,创建一个github仓库. 设置仓库名称. 这时候你需要创建一个ssh密匙,桌面右键Git Bash Here.敲入命令.cd ~/.ssh/,如果提示"no such&qu ...
- 基于.net EF6 MVC5+WEB Api 的Web系统框架总结(4)-Excel文件读、写操作
Excel文件读.写可以使用Office自带的库(Microsoft.Office.Interop.Excel),前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题.还 ...
- 【python+selenium学习】常见错误: 'gbk' codec can't decode byte 0xb0 in position 30
最近编写的自动化脚本,数据部分使用到了从配置文件中取,即自定义config.ini,但是在读取配置文件的时候却报错了'gbk' codec can't decode byte 0xb0 in posi ...
- nginx 反向代理时丢失端口的解决方案(转)
今天,配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常:如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端 ...