`

js之with之函数声明与函数表达式

阅读更多

示例一、
<html >
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
        <script type="text/javascript">

                var obj = {value:2000};
                var value = 100;        
                with(obj){
                    function foo(){//函数声明
                        value *= 2;
                    }
                    foo();
                }        
                console.log(value); //200
                console.log(obj.value); //2000
          
                
        </script>
    </head>    
    <body>
    </body>
</html>




示例二、
<html >
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
        <script type="text/javascript">
           
                var obj = {value:2000};
                var value = 100;        
                with(obj){
                    var foo = function(){//函数表达式
                        value *= 2;
                    }
                    foo();
                }        
                console.log(value); //100
                console.log(obj.value); //4000

        </script>
    </head>    
    <body>
    </body>
</html>



【函数声明】与【函数表达式】
这个问题比较复杂,在ES5中定义了词法环境和变量环境。
当有with时,会创建新的词法环境,函数声明会取自变量环境,函数表达式会取自词法环境。
另外,函数声明不应该放在with里,虽然浏览器实现上不会报错,但从标准的角度,块中不应该包含函数声明。
你可以把函数声明换成函数表达式再看看。
不一定是with,try/catch和with在作用域的处理上十分类似。

这是【函数声明】和【函数表达式】区别的一个经典例子。
也是ECMA-262 5中区分词法环境(Lexical Enviaronment)和变量环境(Variable Environment)的主要原因。

一般很少遇到过。with确实不建议使用,只是例中的问题除了with, 在try/catch语句中也会有类似的问题。
catch(obj) {
    function(....
}
























-
分享到:
评论

相关推荐

    How to do everything with javascript

    此外,函数表达式、立即调用的函数表达式(IIFE)以及函数原型也是函数相关的高级话题。 在JavaScript中,对象是一种复杂的数据结构,允许我们存储和操作键值对。理解对象的创建方式(字面量语法与构造函数)、属性...

    How to Do Everything with JavaScript

    理解函数表达式、匿名函数、函数作用域以及闭包等概念,能帮助开发者更好地组织和重用代码。此外,JavaScript还支持原型继承,这是其面向对象编程的一个独特特征。 JavaScript 2.0,也被称为ECMAScript 3(ES3),...

    JavaScript语言精粹(JavaScript.The.Good.Parts)

    此外,还涉及了函数的使用,包括函数表达式、函数声明、匿名函数和箭头函数。 2. **函数式编程**:Crockford强调了JavaScript的函数是一等公民,可以作为参数传递,也可以作为返回值。书中解释了高阶函数的概念,如...

    Professional JavaScript for Web Developers,3rd Edition_with_code

    理解函数表达式、函数声明以及作用域(全局、局部、块级和闭包)对于编写可维护的代码至关重要。 3. **对象与原型**:JavaScript中的对象是属性和方法的集合,通过原型链实现继承。了解如何创建和操作对象,以及...

    编写高质量代码改善JavaScript程序的188个建议(1-78).docx

    函数表达式(如匿名函数或命名函数表达式)和函数声明是两种不同的函数创建方式。函数声明在代码执行前被提升,而函数表达式不会。理解它们之间的差异可以防止一些意外的错误。 建议6:使用严格模式("use strict") ...

    Vue js with语句原理及用法解析

    在Vue.js的编译过程中,有一段涉及`with`语句的代码,这是在生成渲染函数时使用的。`with`语句在JavaScript中是一个特殊的语法结构,它允许我们将一个对象的作用域设置为当前执行上下文,从而简化对对象属性的访问。...

    McGraw.Hill.How.to.Do.Everything.with.JavaScript.eBook-DDU

    3. **函数与闭包**:阐述函数作为一等公民的概念,函数表达式、函数作用域、闭包的原理及其在内存管理中的应用。 4. **异步编程**:讲解事件循环、回调函数、Promise、async/await等处理异步操作的方法,帮助开发者...

    Secrets of the JavaScript Ninja

    - “Functions are fundamental”部分可能深入探讨了函数在JavaScript中的核心地位,包括函数声明、函数表达式、立即执行函数表达式(IFEE)等。 - “Wielding functions”可能包含高阶函数(Higher-order functions...

    Javascript 完全手册(PDF)

    接着,会讲解函数的使用,包括函数声明、函数表达式、参数和作用域。 面向对象编程在JavaScript中占据重要地位,因此手册会深入讨论对象和原型链。这包括对象的创建方式(字面量语法和构造函数)、原型和继承、以及...

    《李炎恢Javascript笔记》+源码

    JavaScript中的函数有函数表达式(如匿名函数和箭头函数)和函数声明。函数作用域决定了变量的可见性,包括全局作用域和局部作用域。ES6引入了块级作用域,通过let和const关键字实现。 3. **原型与继承**:...

    JavaScript_程序开发手册

    JavaScript还支持匿名函数和箭头函数,提供函数表达式和函数声明两种定义方式。 4. 对象与原型:JavaScript采用基于原型的对象模型,对象可以通过构造函数创建,通过原型链实现属性和方法的继承。 二、JavaScript...

    javascript教程与代码

    JavaScript支持函数表达式和函数声明。 2. **JavaScript对象** - 对象是JavaScript的核心特性,用于组织和存储数据。它们由键值对组成,可以通过点号或方括号访问属性。 - 构造函数与原型:通过构造函数可以创建...

    Getting started with TypeScript with intro Angular

    TypeScript支持JavaScript中的所有类型的函数,包括声明函数、匿名函数和箭头函数。此外,TypeScript还支持函数的重载和可选参数。 9. 模块 TypeScript支持模块化编程,可以将代码分割成小的、可重用的模块。每个...

    javascript

    函数声明和函数表达式是两种定义函数的方式,函数表达式必须先赋值后调用,否则会出现`TypeError`。`for...in`语句用于遍历对象的属性,但属性的遍历顺序是不确定的。在JavaScript中,需要注意这些特性以避免潜在的...

    前台javascript速度优化

    5. 函数优化:减少函数嵌套,使用函数表达式代替函数声明以延迟加载。考虑使用尾调用优化,如果函数最后一步是调用自身或其他函数,可以考虑转换为尾调用形式。 6. 利用事件委托:将事件监听器添加到父元素上,通过...

    改善JavaScript程序的188个建议

    - 函数表达式和函数声明的区别,理解IIFE(立即调用的函数表达式)的作用。 7. **优化循环和条件判断**: - 避免在循环条件中使用复杂的表达式,将计算提前到循环外部。 - 使用短路运算符`&&`和`||`进行条件判断...

    playing-with-js:和朋友一起玩js

    函数表达式和函数声明是两种不同的定义方式,理解它们的差异很重要。 5. 对象和类:JavaScript的对象是键值对的集合,可以通过字面量语法或构造函数创建。ES6引入了类的概念,但实质上仍然基于原型继承。理解原型链...

    javascript面试题汇总.pdf

    16. **函数声明与函数表达式的区别:** 函数声明与函数表达式在解析上有所不同。函数声明会被提升,而函数表达式则在代码执行到该行时才被解析。 17. **作用域、上下文与this关键字:** this关键字引用函数的执行上...

Global site tag (gtag.js) - Google Analytics