javascript中eval和with用法实例总结(2)

function withTest() { with (document) { //document的重复使用 writeln("Hello,"); writeln("it's a with keyword test!"); } with (Math) { //Math的重复使用 alert(random()); alert(abs(-10)); } } withTest();

4、with会暂时修改作用域链

function withTest() { var userName = "jeff wong"; //暂时修改作用域链 with (document) { writeln("Hello,"); writeln(userName); }//with内的语句执行完之后,作用域链恢复原状 alert(userName); } withTest();

分析: 函数withTest在定义的时候,就确定了withTest的作用域链,我们暂且认为这条作用域链的最顶端是window对象,当withTest被执行的时候,js引擎生成了一个call object(调用对象)并将其添加到作用域链尾部上(window对象之后),语句运行到with(document)时,将生成新的作用域(实质上这个作用域和普通function的作用域一样,只不过它在with子句执行完,该作用域也随之消失)并添加到作用域链的尾部,所以with之内的变量查找,就会优先从这条链的with(document)作用域上查找,然后从withTest的call object中查找,最后查找window。with内的语句执行完之后,作用域链恢复原状(with(document)生成的作用域被移出作用域链)。

ps:with是不被推荐的,因为需要操作作用域链(移进、移出作用域),执行效率低下。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgzgdz.html