`
fantaxy025025
  • 浏览: 1247313 次
  • 性别: 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)")
})();
 

 

 

。。。完毕。。。

。。。完毕。。。

。。。完毕。。。

-

-

-

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics