js学习笔记3:with语句的使用
with语句
with是ECMAScript规定的内容,主要用于设置代码在特定对象中的作用域。
var sMessage = "hello";
with(sMessage) {
console.log(toUpperCase()); //输出 "HELLO"
}
//等同于
alert(sMessage.toUpperCase())
with
语句可以在不造成性能损失的情況下,减少变量的长度
with(Math){
length=PI*r*2
x=r*cos(deg)
y=r*sin(deg)
area=PI*r*r
}
上面代码指定Math作为默认对象,先在对象内寻找PI、cos、sin函数与属性,无需Math.PI、Math.cos()、Math.sin()这样写,可以减少不必要的指针路径解析运算,但是可以用临时变量来达到同样的效果。
with(o1.o2.o3) {
console.log(p1 + p2);
}
// 可以写成
var temp = o1.o2.o3;
console.log(temp.p1 + temp.p2);
看了几篇博客和资料,都不太推荐with语句的使用。
1、先在指定的对象再去其他对象查找变量会很慢。
第一个例子里面,当操作变量r与deg时,首先在Math对象里面找不到,之后会再去其他的对象里面寻找。在对性能要求比较高的场合,with里面的语句块,应该只包含指定对象的属性和方法,但是这一点很明显是不太可能滴。
2、容易语义不明,绑定对象不明确,拖慢运行速度。
function f(x, o) {
with (o)
print(x);
}
上面几行代码,如果对象o里面定义了属性x,那么输出的就是o.x,如果没有的话也不会报错,会返回上一级作用域,输出x的值。
万一需要取得是o.x,而某个粗心的队友恰好没有初始化o.x,那就等着完犊子吧,很难出原因来,因为编译器根本就不会报错,这样使用with不利于代码的除错和模块化,编译器也无法对这段代码进行优化,只能留到运行时判断,这就拖慢了运行速度。
3、在 ECMAScript 5 严格模式中该标签已被禁止。推荐的替代方案是声明一个临时变量来承载你所需要的属性。
with
语句少数有用场合之一,就是替换模板变量,不过这个我还没研究明白,等以后有时间再完善。
参考资料:
js学习笔记3:with语句的使用的更多相关文章
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- Vue.js学习笔记:在元素 和 template 中使用 v-if 指令
f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- 2019-4-29 js学习笔记
js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
随机推荐
- IIS发布问题集锦
1. 2.文件都是Not Found 3.删除了PrecompiledApp.config文件就可以了: 4.预编译:http://blog.darkthread.net/post-2012-04-2 ...
- Spring Boot:Thymeleaf篇
Spring Boot干货系列:(四)Thymeleaf篇http://www.cnblogs.com/zheting/p/6707037.html 前言 Web开发是我们平时开发中至关重要的,这里就 ...
- 这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候。
这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候. package main import ( "bytes" "fmt" ...
- Error: Failed to fetch plugin E:_My_File______workMyCodemyCodecordova-workspaceplugman-testMyMath via registry. Probably this is either a connection problem, or plugin spec is incorrect.
$ cordova plugin add E:\_My_File_____\_work\MyCode\myCode\cordova-workspace\plugman-test\MyMath --sa ...
- (转).NET基础拾遗(5)多线程开发基础
https://www.cnblogs.com/edisonchou/p/4848131.html
- spring-boot5代码
App.java package com.kfit.spring_boot_mybatis; import org.mybatis.spring.annotation.MapperScan; impo ...
- sudo -i和sudo -s
sudo -i,加载用户变量,并跳转到目标用户home目录:sudo -s,不加载用户变量,不跳转目录: sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码, ...
- linux系统调用mount全过程分析【转】
本文转载自:https://blog.csdn.net/skyflying2012/article/details/9748133 系统调用本身是软中断,使用系统调用,内核也陷入内核态,异常处理,找到 ...
- FZU2013 A short problem —— 线段树/树状数组 + 前缀和
题目链接:https://vjudge.net/problem/FZU-2013 Problem 2013 A short problem Accept: 356 Submit: 1083Ti ...
- HDU2825 Wireless Password —— AC自动机 + 状压DP
题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others) ...