美文网首页WEB前端程序开发
with/try-catch/eval改变作用域链

with/try-catch/eval改变作用域链

作者: F1503 | 来源:发表于2018-02-05 17:08 被阅读142次

最近在重新复习js基础知识,所以自己准备做个容易混淆题集,如果有什么问题还请大家多多指教^^

问题:下面哪种方式不能改变作用域链?

 A、with

B、try-catch

C、while

D、eval

答案:C

解析:

>with:对于with语句来说,将会指定的对象添加到作用域链中

>tr-catch:红皮书第四章说到,虽然执行环境的类型总共只有两种(全局和局部),但还是有其他办法来延长作用域链。因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。try catch中的catch块,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

   example:

function builderUrl(){

var qs = '?debug = true";

with (location){

  var url = href + qs;

}

return url;

}

这个例子中with语句接受的是location对象,因此其变量对象中就包含了location对象的所有属性和方法,而这个变量对象被添加到作用域链的前端。builderUrl()函数中定义了一个变量qs。当在with语句中引用变量href时(实际引用的是location.href),可以在当前执行环境的变量对象中找到。当引用变量qs时,引用的则是在builderUrl()中定义的这个变量,而该变量位于函数环境的变量对象中。至于with语句内部,则定义了一个名为url的变量,因而url就成了函数执行环节的一个部分,所以可以作为函数的值被返回

>eval:是把字符串转换为js代码,如果字符串中有新定义函数,那么它就有可能再建一个执行环境。

>while:只是在函数局部环境或者全局环境运行,并不会改变作用域链。

相关文章

  • 2018-01-15

    延长作用域链~~with、eval、try-catch

  • with/try-catch/eval改变作用域链

    最近在重新复习js基础知识,所以自己准备做个容易混淆题集,如果有什么问题还请大家多多指教^^ 问题:下面哪种方式不...

  • 2019-12-17:第四章:垃圾回收,内存管理,小结

    2.1作用域增长 with和try-catch语句可以在作用域链的前端添加新的变量对象。当执行流进入with或者t...

  • JS的作用域

    JS的作用域: 全局作用域、函数作用域、eval 作用域、块级作用域 全局作用域: 函数作用域: 结果截屏: 说...

  • 你不知道的 Javascript

    作用域 词法作用域:编译阶段确定(欺骗词法作用域 eval with) 块作用域 with try/catch l...

  • ES6-let const

    let特性1.不能重复申明2.块级作用域 全局 函数 eval3.不存在变量提生4.不影响作用域链 const声明...

  • eval作用域

    输出 原因: (1,eval)是个表达式,;类似1&&eval,属于间接引用了eval; eval 只在被直接调用...

  • 避免使用eval及with

    JavaScript中有两个可以破坏作用域的函数eval和with eval 上面代码运行后直接会修改全局作用域中...

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • JS中eval()解析和为什么不要使用eval

    eval翻译:是evaluate,评估,评价的意思。eval的重点在于eval函数名赋值给变量之后,它的作用域可能...

网友评论

    本文标题:with/try-catch/eval改变作用域链

    本文链接:https://www.haomeiwen.com/subject/acrizxtx.html