`
fantaxy025025
  • 浏览: 1308972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

编程语言_词法作用域_比较和区别_in_Ruby_Javascript

 
阅读更多

词法作用域有很多文章,这里想说的是javascript的词法作用域是不严格的,或者说是有“预编译“的嫌疑的。

而ruby中,词法作用域是严格的,看看例子讨论吧。

 

Js

        function m_a(){
            if(false){
                var a = 100;
            }
            //这里可以调用b,不会报错,虽然b的定义在后面
            console.debug("a = " + a + ", b = " + b);
            if (false) {
                var b = 200;
            }
        }

Ruby

class JuneLee
  def m_a
    puts h #这里不能使用h
    if(false)
      h = 100
    end
  end
end

lee = JuneLee.new
lee.m_a

你觉得哪个更合理,喜欢哪个呢?

 

几个js的例子,看看js的预编译性(提示,下面的例子1例子2 输出不同:

 

(function(){//例子0
  f();
  function f(){
    console.debug(111);
  }
})();

//例子1
(function f() {
  console.debug("before f(1)")
  var f = function() {
    console.debug("in f(1)")
    return 1;
  }
  console.debug("after f(1)")

  console.debug("before return");
  var x = f();
  var y = 100;
  console.debug("y = " + y);
  return x;
  console.debug("after return");

  var y = 200;
  console.debug("before f(2)")
  var f = function() {
    console.debug("in f(2)");
    return 2;
  }
  console.debug("after f(2)")
})();

//例子2
(function f() {
  console.debug("before f(1)")
  function f() {
    console.debug("in f(1)")
    return 1;
  }
  console.debug("after f(1)")

  console.debug("before return");
  var x = f();
  var y = 100;
  console.debug("y = " + y);
  return x;
  console.debug("after return");

  var y = 200;
  console.debug("before f(2)")
  function f() {
    console.debug("in f(2)");
    return 2;
  }
  console.debug("after f(2)")
})();
 

 

 

。。。完毕。。。

。。。完毕。。。

。。。完毕。。。

-

-

-

 

 

分享到:
评论

相关推荐

    SD大会精品讲座:JavaScript引擎技术

    例如,闭包和作用域的概念就是通过特定的数据结构和算法来实现的。 ##### 5.2 引擎如何处理原型继承 JavaScript引擎通过内部数据结构来维护对象之间的继承关系。当一个对象试图访问一个不存在的属性或方法时,引擎...

    JavaScript 手册

    它首先介绍JavaScript语言本身,强调其作为一种流行的编程语言的地位,并且随着Node.js的发展,它已经不只限于浏览器端开发,还扩展到了后端开发领域。Node.js的兴起将JavaScript语言的应用范围拓宽到传统后端语言如...

    JavaScript权威指南(第6版)

    他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...

    javascript-is-like-ruby:讨论JavaScript如何变得越来越像Ruby

    6. **闭包和迭代器**:Ruby 和 JavaScript 都支持闭包,允许函数访问并操作其词法作用域内的变量。Ruby 的 `each` 方法是迭代器的典范,而 JavaScript 的 `for...of` 和 `Array.prototype.forEach` 等方法也提供了...

    JavaScript权威指南(第6版)(附源码)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    JavaScript权威指南(第6版)(中文版)

    他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...

    javascript_to_do_list:Railsbridge 教程应用程序

    JavaScript_to_do_list是一个基于Railsbridge教程的项目,旨在帮助初学者理解JavaScript编程语言以及它如何与Web开发中的其他技术,特别是Ruby on Rails框架相结合。这个应用程序是一个简单的待办事项列表,用户可以...

    使用C语言编写的脚本语言Tiderip解释器.zip

    5. **变量作用域和生命周期**:Tiderip可能有自己的作用域规则,决定变量的可见性和生命周期。 6. **函数和模块**:Tiderip可能支持函数定义和模块化,以支持代码重用和组织。 7. **错误处理**:解释器需要处理语法...

    Basics.Of.Compile.Design

    这包括类型检查、作用域解析和常量折叠等操作。例如,如果在Java中声明一个整型变量后赋值一个浮点数,编译器会在这一阶段报错。 最后,代码生成(Code Generation)阶段,编译器将AST转换为目标机器的语言,通常是...

    jars_20220926.tar.gz

    标签 "函数闭包" 提到了一个核心的编程概念,特别是针对像JavaScript、Python、Ruby等支持函数式编程的编程语言。在这些语言中,闭包是指一个函数能够记住并访问其词法作用域内的变量,即使该函数在定义时的环境已经...

    SuperCollider-3.11.0-macOS-signed.zip 亲测可用:用于音频合成和算法合成的平台

    功能语言-sclang单一继承面向对象和函数式语言类似于Smalltalk或Ruby,语法类似于C或Javascript动态类型恒定时间消息查找和实时垃圾收集用作一流对象闭包是词法,作用域是词法和动态协程列表理解局部应用(显式计算...

    20212022年前端面试题整理含答案.docx

    而使用箭头函数时,`this`的绑定遵循词法作用域,即箭头函数内的`this`保持了定义时的作用域,所以第二个示例中,`this.x`正确地打印出`100`。 2. **Vue.js框架的理解**: Vue.js由尤雨溪创建,是一个轻量级的渐进...

    ZerocICE3.6.2

    - **模块的作用域**:介绍模块内定义的元素的作用域规则。 ##### 1.3.5 基本类型 - **内置类型**:列出Slice中预定义的所有基本数据类型。 - **类型声明**:介绍如何声明自定义的基本类型。 ##### 1.3.6 用户定义...

    seven-more-languages:Lua, Elixir, Elm, Factor, Idris, Julia, MiniKanren

    Factor是一种动态的、基于词法作用域的栈式编程语言,强调简洁和可读性。它的语法类似于Lisp,但使用后缀表达式(逆波兰表示法)。Factor拥有丰富的词汇表(vocabulary)系统,支持元编程和混合面向对象/函数式编程...

    ZeroC Ice3.7 官方手册英文版加注中文书签

    - **1.3.15 名称和作用域(Names and Scoping)**:详细解释了名称和作用域的管理规则。 - **1.3.16 元数据(Metadata)**:讲解了元数据的定义及其使用方法。 - **1.3.17 可序列化对象(Serializable Objects)**:...

    Ice3.6.0 手册

    - **语言映射概览**:Ice支持多种编程语言,并为每种语言提供了一组映射规则,使得开发者可以在不同语言之间进行通信。 - **客户端和服务端结构**:这一部分详细介绍了Ice应用程序中的客户端和服务端如何构建,包括...

Global site tag (gtag.js) - Google Analytics