JavaScript中with语句的理解

with语句的作用是暂时改变作用域链、减少的重复输入。

其语法结构为:

Js代码

  1. with(object){
  2. //statements
  3. }

举一个实际例子吧:

Js代码

  1. with(document.forms[0]){
  2. name.value = "lee king";
  3. address.value = "Peking";
  4. zipcode.value = "10000";
  5. }

与之对应的传统的写法是:

Js代码

  1. document.forms[0].name.value = "lee king";
  2. document.forms[0].address.value = "Peking";
  3. document.forms[0].zipcode.value = "10000";

可以看出with语句的简洁明了,不过在代码的世界里是很难找到真正的完美。

js的解释器需要检查with块中的变量是否属于with包含的对象,这将使with语句执行速度大大下降,并且导致js语句很难被优化。为了兼顾速度与代码量可以找到一个比较折衷的方案:

Js代码

  1. var  form = document.forms[0];
  2. form.name.value = "lee king";
  3. form.address.value = "Peking";
  4. form.zipcode.value = "10000";

所以在以后的高效代码开发中我们应该尽可能的避免使用with语句。

经过测试:

var a = 123;
var b = {a : 321};
with(b){
    console.log(a); // 321
}

var a = 123;
var b = {}; 这里去掉b中的a属性
with(b){
    console.log(a); // 123
}从作用域链来分析

在javascript中,函数也是对象,实际上,javascript中的一切都是对象。函数内部有一个只给javascript引擎访问的内部属性是[[scope]],该属性包含了函数创建时的作用域中对象的集合,这个集合就叫做作用域链。

比如下面代码:

function add(num1,num2) {

var sum = num1 + num2;

return sum;

}

在函数创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图:

当函数被执行时,会创建一个活动对象,该对象包含了函数所有局部变量、命名参数以及this,然后该对象会被推入作用域链的前端,当函数执行完毕,该对象也随之销毁。如下图:

 

可以看到,全局变量会被活动对象推到作用域链的最后端,这也就是为什么全局变量访问速度慢的原因!

with

一般情况下,作用域链只会被with和catch语句影响。当使创建用with的时候,函数会创建一个新的活动对象,推到最前端,该对象就是with的对象。这就意味着所有的局部变量都处于第二个作用域链对象中去了,这也就是为什么要避免使用with的原因。

 

 
时间: 2024-08-02 00:23:08

JavaScript中with语句的理解的相关文章

深入浅析JavaScript中with语句的理解

JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变作用域链.减少的重复输入. 其语法结构为: with(object){ //statements } 举一个实际例子吧: with(document.forms[]){ name.value = "lee king"; address.value = "Peking";

JavaScript中With 语句使用方法实例

内容导读: 有了 With 语句,在存取对象属性和方法时就不用重复指定参考对象,在 With 语句块中,凡是 JavaScript 不识别的属性和方法都和该语句块指定的对象有关.With 语句的语法格式如下所示: With Object { Statements } 对象指明了当语句组中对象缺省时的参考对象,这里我们用较为熟悉的 Document 对象对 With 语句举例.例如 当使用与 Document 对象有关的 write( )或 writeln( )方法时,往往使用如下形式: docu

javascript中with语句应用

语法格式: with(obj){} obj指明了语句组中对象缺省时的参考对象,就是代表该语句块中的默认作用域为obj. <html> <head> <title></title> <meta charset="utf-8"/> <script type="text/javascript"> function test(){ var obj=document.getElementById(&quo

JavaScript中的伪数组理解

看过jQuery源码的人都知道类数组对象,与我们熟知的arguments对象很像 构造一个类数组必须有两个条件 第一个条件:你必须给对象定义个splice方法,只要他是一个function就可以 第二个条件:就是赋值一个length属性,或者增加push,unshift,shift,pop其中任何一个方法,并且调用了一次. 当这两个条件同时满足那么当前的对象在控制台输出后跟数组的格式一模一样. 一般而言大部分都是这样构造一个类数组对象(jQuery就是这么干的).因为相比而言,这样更简洁,并且更

对Javascript中原型的深入理解

  理解原型对象 在Javascript中无论什么时候,只要创建一个新的函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象(这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法).如果按照字面上的意思来理解,那么原型属性就是通过调用构造函数而创建的那个对象的实例的原型对象. 在默认的情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针.如下图 function P

第一篇 对Javascript中原型的深入理解

  理解原型对象 在Javascript中不管什么时候,仅仅要创建一个新的函数,就会依据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象(这个对象的用途是包括能够有特定类型的全部实例共享的属性和方法).假设依照字面上的意思来理解.那么原型属性就是通过调用构造函数而创建的那个对象的实例的原型对象. 在默认的情况下,全部的原型对象都会自己主动获得一个constructor(构造函数)属性,这个属性包括一个指向prototype属性所在函数的指针. 例如以下图 func

JavaScript - javascript 中的 &quot;||&quot; 与 &quot;&amp;&amp;&quot; 的理解与灵活运

你肯定见到过这样的代码:a = a||"xxx". 它其实就等价于下面三种形式的代码: a = a || "xxx"; 与: if (!a) { a = "xxx"; } 和: if (a == null || a == "" || a == undefined) { a = "xxx"; } 如何理解三种代码.首先必须理解一个问题: javascript 中的数据类型在与bool类型转换时候发生了什么?

JavaScript中this关键字的理解

this是个什么鬼? this是JavaScript中的一个关键字,代表当前对象. this在那些情况下会指向谁?如下文. 一.调用全局变量(Global Variable) var x="我是全局变量呦"; function obj() { alert(this.x); } obj(); //我是全局变量呦 此时,this指向了全局变量x. 二.将this作为对象的方法来调用. function test() { alert(this.x); } var obj={}; obj.x=

如何快速理解JavaScript 中重要语句for循环

一.基本结构:for(起始状态:判断条件:状态改变){ 执行语句: } 执行顺序:for(var i=1;i<3;i++){ alert(i); } 1.判断条件    2.执行语句    3.状态改变 break(结束此循环).continue(跳过本次循环,开始下个循环) 二.例: 1.输出100 以内与7相关的数 <script type="text/javascript"> var str = ''; for(var i = 1; i <= 100; i