CoffeeScript中的外部变量与局部变量的屏蔽

  刚接触CoffeeScript时,一直不清楚它存在的意义,搜索过部分资料,可以总结为两点:①语法糖,减少代码量增加可读性②增强js代码的合法性,编译之后的js代码跟手动写的相比基本没语法错误。

其实自我感觉代码量确实减少了,但是也并不是很可观,语法糖确实使用起来很方便,而语法错误这一点,个人感觉只要是对js有一定了解的人不一定会比他差,差也差不太多,个人感觉。

  说一下在使用过程中遇到的比较头疼的一点,就是外部变量与局部变量的屏蔽机制。

  如下代码:

a = (callback) ->
    setTimeout callback, 0
a ()->
    console.log "#{temp} in the callback"
    temp = 3

temp = 1;
console.log "#{temp} out the callback"

  在这句输出语句中 console.log "#{temp} in the callback",temp一直是undefined,众所周知在coffee的编译中会自动将代码中出现的变量放在函数开头进行声明,而在js中如下代码:

var a, temp;

a = function(callback) {
  return setTimeout(callback, 0);
};

a(function() {
  console.log("" + temp + " in the callback");
  return temp = 3;
});

temp = 1;

console.log("" + temp + " out the callback");

  上述代码中的输出应该是 “1 out the callback", "1 in the callback"

  在callback中是能读取到外部的temp变量的,而在coffee中却读取不到,什么情况呢,于是将编译后的代码仔细阅读一遍发现(看过好几次,奈何项目中该函数内变量太多一直没看到,囧),编译后的代码是

var a, temp;

a = function(callback) {
  return setTimeout(callback, 0);
};

a(function() {
  var temp;//注意此处,重新声明了temp变量
  console.log("" + temp + " in the callback");
  return temp = 3;
});

temp = 1;

console.log("" + temp + " out the callback");

  发现在callback中又重新声明了temp变量将外部变量给屏蔽掉了,如何解决这个问题呢,我们只需将temp = 1的赋值提到callback的定义之前即可。

  还记得在一开始接触coffee时,网上有同学问过coffee中如何写出下面的语句:

var a = 1;
function b () {
  var a = 2;
}

  现在有解决方案了,我们只需要将a=1的赋值放在函数b下面即可:

b = ()->
  a = 2
a = 1

  还有一点需要注意的是,coffee中‘’与”“的编译结果也会不一样的,如:

a = 1
‘a is #{a}‘ //输出 a is #{a}
"a is #{a}" //输出 a is 1

  事后仔细想了想,或许可能一开始就对coffee带有一种排斥心理,因此也没好好看过官方文档,带来各种”莫名其妙“的错误

  俗话说的好,存在即合理,任何语言都有自己存在的意义,自己去思考吧,不过我一直觉得它的可读性也没有js强啊...╯□╰

				
时间: 2024-10-14 23:52:20

CoffeeScript中的外部变量与局部变量的屏蔽的相关文章

C#:在匿名方法中捕获外部变量

先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void TestDelegate(); static void Main(string[] args) { TestDelegate[] delegates = new TestDelegate[2]; int outside = 0; for(int i = 0; i < 2; i++) { int insid

java中的成员变量和局部变量的区别

成员变量: 在类体里面定义的变量叫做成员变量: 如果在变量有static关键字修饰,就叫作静态变量或类变量: 如果该变量没有static关键字修饰,就叫作非静态变量或实例变量: 局部变量: 方法内定义的变量.形参.代码块中定义的变量都叫做局部变量: 另外,成员变量可以不显式初始化,它们可以由系统设定默认值:局部变量没有默认值,所以必须设定初始赋值. 还有,在内存中的位置也不一样.成员变量在所在类被实例化后,存在堆内存中:局部变量在所在方法调用时,存在栈内存空间中. 原文地址:https://ww

java中的成员变量,局部变量的理解

首先我们来理解什么是变量,依我来看,变量就是用来存放值的一个名字或者引用,比如年龄,性别,班级,学号,身份证号码等等.对于不同的对象当然有不一样数值.变量也有自己的属性,比如整数型,字符串类型,浮点型等等,基本数据类型和引用数据类型都可以.一个类里面有属性和方法,局部变量和成员变量的区别就输成员变量在类里面的作用区域是在整个类中使用.局部变量是指在方法里面的变量,作用域只在方法里面. 原文地址:https://www.cnblogs.com/yindong2019/p/11780599.html

JAVA中的成员变量与局部变量

package com.imooc; //1.定义一个类 public class Telphone { //2.属性(成员变量)有什么 float screen; float cpu; float mem; int var = 30; //3.方法干什么 void call(){ int var = 40; int localVar=0; System.out.println("var:"+var); System.out.println("loclaVar:"+

Python:字符串中引用外部变量的3种方法

方法一: 1 username=input('username:') 2 age=input('age:') 3 job=input('job:') 4 salary=input('salary') 5 6 info1=''' 7 -----------------------info of %s---------------------------- 8 Name:%s 9 Age:%s 10 Job:%s 11 Salary:%s 12 ''' %(username,username,age

C#中成员变量和局部变量的区别

成员变量: 定义:在类中定义的变量称为成员变量 作用范围:在整个类中都有效 分类:成员变量又可分为实例变量和静态变量(加上关键字static) class test1 { int a = 33; //实例变量,在类test1中有效 static int b = 45: //静态变量,在整个程序中都有效,其他类中可以调用 } 局部变量: 定义:在方法中定义的变量称为局部变量 作用范围:当前定义的方法内有效,方法调用被销毁,不能在其他类中进行调用 原文地址:https://www.cnblogs.c

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl

一个注意事项:内部类引用的外部变量必须是final的

之前写过一个项目,好久没更新了,最近翻起以前的代码,发现在这里报了一个错.(现在转到Intellij了,从前在Eclipse luna中是可以编译通过的,Eclipse mars也会报错,JDK版本都是1.8,还没去查为什么) 为什么在内部类中引用外部变量时,必须声明为final呢? 最开始我想的是,会和Java的内存模型有关.因为我们都知道,带有static的变量或者方法是属于类的,也就是说,类成员是被储存在堆内存里面的.那么final是否也是这样?经过查找资料,得知:final 是保护 所修

JAVA类与对象(四)----成员变量与局部变量 、成员方法、构造方法

类体中的变量分为两部分.变量定义部分定义的变量为类的成员变量,在方法体中定义的变量和方法中涉及的变量称为局部变量. 成员变量和局部变量的区别: (1).成员变量在整个类中都有效,局部变量只在定义它的方法中有效 (2).成员变量分为实例成员变量(简称实例变量)和类变量(简称静态变量),如果在成员变量类型前加static,这个变量就称为类变量. (3).如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏 ,也就是说,这个成员变量在这个方法中暂时失效. 例: public class Benso